delphi - 为什么记录的大小不等于其字段大小的总和?

标签 delphi sizeof

我有下一个代码:

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/

相关文章:

delphi - Delphi Firemonkey中的鼠标事件动画

delphi - TDataSource 后代作为子组件的无效属性路径错误

c++ - 可变参数结构体臃肿,在结构体末尾添加了额外的填充

c - C中char类型的大小

c - C中动态分配数组的大小

Delphi:我应该使用重载,重新引入+重载还是不使用?

delphi - 应用程序图标卡住 DELPHI XE5

c# - 本地化与定制

c++ - Sizeof() 的 VBA 等价物?

c - 为什么我不能检索我的灵活数组成员大小?