我有下一个代码:
type TRecord1 = record
myarr: array [0..31] of single:
end;
type TRecord2 = record
b1, b2, b3, b4, b5, b6: byte;
end;
type TRecord3 = record
myarr: array [0..31] of single:
b1, b2, b3, b4, b5, b6: byte;
end;
procedure TForm1.FormCreate(Sender: Tobject);
begin
ShowMessage(IntToStr(SizeOf(TRecord1))+'+'+IntToStr(SizeOf(TRecord2))+
'='+IntToStr(SizeOf(TRecord3)));
end;
程序显示以下消息:
128+6=136
为什么 SizeOf(TRecord3)
等于 136 而不是 134?
最佳答案
这是由于记录对齐而添加了填充。 TRecord3
的对齐方式为 4,因为它包含单个
值。因此,将填充添加到记录的末尾,以使大小恰好是 4 的倍数。这就是大小为 136 而不是您期望的值 134 的原因。
您可以将记录声明为压缩
,或者等效地将对齐编译器选项设置为$ALIGN 1
。如果对齐方式为 1
,则不会向记录添加填充,并且 SizeOf(TRecord3)=134
。但是,我强烈建议您不要这样做。使用自然对齐可以实现最有效的记录内存访问。例如,对于处理器来说,加载未对齐的值比加载对齐的值更昂贵。对于单个
或整数
,自然对齐在4字节边界上。对于double
,自然对齐是在 8 字节边界上,依此类推。如果您需要与使用打包记录的另一个库进行二进制兼容性,则应该使用打包记录。
关于delphi - 为什么记录的大小不等于其字段大小的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9803124/