Delphi 为什么变量记录报告的大小应该更大?

Delphi 为什么变量记录报告的大小应该更大?,delphi,record,delphi-10.3-rio,Delphi,Record,Delphi 10.3 Rio,我尝试了以下代码: TDairyItemType = (dtFood, dtRecipe, dtExercise); TFourDecimalDWord = DWord; TDiaryItem = record ID: DWord; // 4 bytes Positive: Boolean; // 1 byte GID: Word; // 2 bytes case ItemType: TDairyItemType of // 1 byte dtFo

我尝试了以下代码:

  TDairyItemType = (dtFood, dtRecipe, dtExercise);
  TFourDecimalDWord = DWord;

  TDiaryItem = record
   ID: DWord;  // 4 bytes
   Positive: Boolean; // 1 byte
   GID: Word;  // 2 bytes
  case ItemType: TDairyItemType of  // 1 byte
   dtFood, dtRecipe: (ServID: Word; Serving: TFourDecimalDWord); // 6 bytes
   dtExercise: (Time: Word; Kcal: TFourDecimalDWord); // 6 bytes
  end;

procedure TForm1.Button1Click(Sender: TObject);
var Item: TDiaryItem;
begin
  Item.ServID:= 333;
  Caption:= 'Item size: '+IntToStr(SizeOf(TDiaryItem))+'  /  Item.Time: '+IntToStr(Item.Time);
end;

这表明记录的大小是20,但应该是14,因为记录的最后两行使用相同的空间。我给
ServID
字段分配了一个值,并从
Time
字段读取该值,它确认它们共享相同的空间。。。我缺少什么?

对齐将添加额外的字节。使用
packed
来删除它们,这里显示为14个字节

procedure TForm1.Button1Click(Sender: TObject);
type
  TDairyItemType = (dtFood, dtRecipe, dtExercise);
  TFourDecimalDWord = DWord;

  TDiaryItem = packed record
   ID: DWord;  // 4 bytes
   Positive: Boolean; // 1 byte
   GID: Word;  // 2 bytes
  case ItemType: TDairyItemType of  // 1 byte
   dtFood, dtRecipe: (ServID: Word; Serving: TFourDecimalDWord); // 6 bytes
   dtExercise: (Time: Word; Kcal: TFourDecimalDWord); // 6 bytes
  end;

begin
  button1.Caption:= 'Item size: '+IntToStr(SizeOf(TDiaryItem));
end;

非压缩记录中字段的对齐。“默认情况下,结构化类型中的值在单词或双单词边界上对齐,以便更快地访问。”因此,如果我使用
case
语句而不使用
packed
,我不会保存任何内容。您可以重新排列字段,使它们更适合对齐。例如,将
正数
移动到
大小写
之前,将其压缩到16字节。当然,请注意,如果没有适当考虑,您不应该开始打包所有记录。默认情况下,填充是有原因的。我得说,很少有人认为包装是个好主意。主要是,如果您需要布局符合某些固定的二进制格式(例如,文件格式规范),那么它非常有用。仅仅为了“节省内存”而打包很少是个好主意。几乎从来没有。现在的计算机有很多内存。