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

Xav*_*ver 9 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;
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字节边界上,依此类推.如果需要与使用打包记录的另一个库进行二进制兼容,则应使用打包记录.

  • 此外,您可以将声明更改为`type TRecord3 = packed record ...`以防止记录对齐,尽管通常您不需要.对齐记录表现更好,但在某些情况下,您可能需要打包记录. (2认同)