//定义记录
type
h=record
a:array [0..10] of char;
b:array [0..10] of char;
c:array [0..10] of char;
e:longword;
end;//输出记录长度
var
h1:h;
begin
Memo1.lines.add(IntToStr(sizeof(h1)));
end;
//输出结果:
40可实际上记录h中4个字段长度相加应是:11+11+11+4=37为什么输出结果会多出3? 如果记录h只有a和e字段,则输出多1;如果只有a,b,e则输出多出2。我知道零基准数组存储NULL结尾的字符串,和这个有关系吗。而且如果把记录h的e字段去掉,则输出长度是正确的。请问这是怎么会事情?多出的长度是从那里来的?在记录h的什么位置?谢谢!
type
h=record
a:array [0..10] of char;
b:array [0..10] of char;
c:array [0..10] of char;
e:longword;
end;//输出记录长度
var
h1:h;
begin
Memo1.lines.add(IntToStr(sizeof(h1)));
end;
//输出结果:
40可实际上记录h中4个字段长度相加应是:11+11+11+4=37为什么输出结果会多出3? 如果记录h只有a和e字段,则输出多1;如果只有a,b,e则输出多出2。我知道零基准数组存储NULL结尾的字符串,和这个有关系吗。而且如果把记录h的e字段去掉,则输出长度是正确的。请问这是怎么会事情?多出的长度是从那里来的?在记录h的什么位置?谢谢!
a:array [0..10] of char;
b:array [0..10] of char;
c:array [0..10] of char;
e:LongWOrd;
end;
定义为packed record长度将会正常
————同上如果只有a,b,e则输出多出2
————同上
record要进行边界对齐,牺牲存储空间以提高访问速度
packed record是不进行对其,所以是实际声明的空间长度!
对齐的过程中是以32位进行的!
1个char是8位,所以4个char对应一个32位,那么就需要(11+1) / 4 才可以除端
所以要补足一个char对与a, b, c就要补3个,所以大小是11*3 + 4 + 3 = 40
(sizeof(a)+sizeof(b)+sizeof(c)+X)/4整除才是正确解释
如果按楼上的两种解释:
h = record
a:array[0..1]of char;
b:array[0..1]of char;
c:integer;
end;
size(h1)=8; {zwjchina(蒲石)的说法对这个结论解释不通} h = record
a:array[0..1]of char;
b:array[0..2]of char;
c:integer;
end;
size(h1)=12;:{ bigysw(大花脸)的说法对这个好像解释不通}
...........................................................
{$A-}
type
h = record
a:array[0..1]of char;
b:array[0..2]of char;
c:integer;
end;
补上的char的位置在那里?是每个数组字段的后面,还是这个记录h的后面补?
因为如果是后者,则可以在不影响访问速度的情况下轻易去掉这些补上的char的。
对于你那个记录 h = record
a:array[0..1]of char;
b:array[0..1]of char;
c:integer;
end;
size(h1)=8; {zwjchina(蒲石)的说法对这个结论解释不通}a的长度为2,所以要(2+2)/4才可以除断,
b同样要加2,
所以就是 2(a的)+ 2(补齐a的) + 2(b的)+ 2(补齐b的) + 4(c的) = 8
没有任何解释不通的地方!