B
beta
Unregistered / Unconfirmed
GUEST, unregistred user!
对于 ShortString,是在 str[0] 存放长度的,因为只有 1 个字节,所以字符串
长度只有 255。但是那是 Pascal 时代的事情了。
现在的 Delphi 默认的字符串是 AnsiString,其长度存放在负偏移 4 字节的位置
所以长度可以达到 4G。而一个 AnsiString 的变量其实是一个指针,即 4 个字节
比如:
var
str: string; // AnsiString,即编译器选项的 HugeString
begin
str := 'Hello';
假如这时 str 中存放的是 1234H, 那么实际的字符 'H' 是存放在地址 1234H 处的
而 1234H 的负 4 字节偏移处,即 1230H 处存放的就是 str 的长度:5
Length 函数就是直接读取这个数值,所以比要从头到尾扫描字符串结束符的 strlen
快得多。
刚才说了,声明 str: string 是声明的一个 AnsiString;那么 str1: string[20]呢?
它是一个 ShortString,因为你指明了长度,对他,你不必再动态分配空间
所以,伊天仇 的说法的确是错误的,指针的长度的确是定长。但是 Length(s) 取得的
并不是指针 s 的长度,它取的什么,我已经讲过了。 我知道你的试验的意思,不过
你要做这个试验的话,应该将 Length(s) 换成 SizeOf(s),那你就会知道结果了:)
现在回答 snowrain 最开始提出的问题:
RTest=Record
Name:string[20]; // 长度 20+1; 由于 字段对齐,增至 24
Identifier:integer; // 4;
Content:string; // 4;
end;
所以 SizeOf(RTest) = 24 + 4 + 4 = 32,因此 New(p) 也是分配那么多内存
长度只有 255。但是那是 Pascal 时代的事情了。
现在的 Delphi 默认的字符串是 AnsiString,其长度存放在负偏移 4 字节的位置
所以长度可以达到 4G。而一个 AnsiString 的变量其实是一个指针,即 4 个字节
比如:
var
str: string; // AnsiString,即编译器选项的 HugeString
begin
str := 'Hello';
假如这时 str 中存放的是 1234H, 那么实际的字符 'H' 是存放在地址 1234H 处的
而 1234H 的负 4 字节偏移处,即 1230H 处存放的就是 str 的长度:5
Length 函数就是直接读取这个数值,所以比要从头到尾扫描字符串结束符的 strlen
快得多。
刚才说了,声明 str: string 是声明的一个 AnsiString;那么 str1: string[20]呢?
它是一个 ShortString,因为你指明了长度,对他,你不必再动态分配空间
所以,伊天仇 的说法的确是错误的,指针的长度的确是定长。但是 Length(s) 取得的
并不是指针 s 的长度,它取的什么,我已经讲过了。 我知道你的试验的意思,不过
你要做这个试验的话,应该将 Length(s) 换成 SizeOf(s),那你就会知道结果了:)
现在回答 snowrain 最开始提出的问题:
RTest=Record
Name:string[20]; // 长度 20+1; 由于 字段对齐,增至 24
Identifier:integer; // 4;
Content:string; // 4;
end;
所以 SizeOf(RTest) = 24 + 4 + 4 = 32,因此 New(p) 也是分配那么多内存