我有下一个代码:
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;
Run Code Online (Sandbox Code Playgroud)
该程序显示以下消息:
128+6=136
Run Code Online (Sandbox Code Playgroud)
为什么SizeOf(TRecord3)等于136而不是134?
Dav*_*nan 15
这是由于记录对齐而添加了填充.TRecord3对齐为4,因为它包含single值.因此,填充将添加到记录的末尾,以使大小为4的精确倍数.这就是为什么大小为136而不是您期望的134的值.
您可以声明您的记录packed,或者等效地将对齐编译器选项设置为$ALIGN 1.对齐时,1记录中不会添加填充和SizeOf(TRecord3)=134.但是,我强烈建议你不要这样做.使用自然对齐可以为记录提供最有效的内存访问.例如,处理器加载未对齐值比加载对齐值更昂贵.对于a single或an integer,自然对齐在4字节边界上.对于double自然对齐是在8字节边界上,依此类推.如果需要与使用打包记录的另一个库进行二进制兼容,则应使用打包记录.
| 归档时间: |
|
| 查看次数: |
2084 次 |
| 最近记录: |