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字节。当然,请注意,如果没有适当考虑,您不应该开始打包所有记录。默认情况下,填充是有原因的。我得说,很少有人认为包装是个好主意。主要是,如果您需要布局符合某些固定的二进制格式(例如,文件格式规范),那么它非常有用。仅仅为了“节省内存”而打包很少是个好主意。几乎从来没有。现在的计算机有很多内存。