Delphi 是否为变体记录分配了额外空间?
我正在使用下面的变体记录。变量实例是Kro_Combi。SizeOf(Kro_Combi)报告7812字节。SizeOf(Kro_Combi.data)报告7810字节。 构成variant记录的“non-directmode”案例的所有其他数据结构的SizeOf之和也增加到7810字节 为什么会有两个字节的差异?我想让两个变体完全重叠Delphi 是否为变体记录分配了额外空间?,delphi,record,Delphi,Record,我正在使用下面的变体记录。变量实例是Kro_Combi。SizeOf(Kro_Combi)报告7812字节。SizeOf(Kro_Combi.data)报告7810字节。 构成variant记录的“non-directmode”案例的所有其他数据结构的SizeOf之和也增加到7810字节 为什么会有两个字节的差异?我想让两个变体完全重叠 TKro_Combi = record case directmode:boolean of true : ( data : array
TKro_Combi = record
case directmode:boolean of
true : (
data : array[0..7809] of byte
);
false : (
Combi_Name : array[0..23] of char; //24
Gap1 : array[0..63] of byte; // 24-87 (64)
Ins_Effect_Group : array[1..12] of TIns_Effect_Params; //74 each, (Ins_Effect_Data=9 bytes) 74*12 = 888
Mast_Effect_Params : array[0..229] of byte; // 976-1205 : 230 bytes
Vect_Aud__Drum_Params : array[0..97] of byte; //1206-1303 : 98 bytes
Karma_Common : array[0..509] of byte; //1304-1813 : 510 bytes
Karma_Module : array[0..3] of TKarma_Module; //1814-2557 : 744 bytes each Total span 1814 - 4789 = 2976 bytes total
Common_Params : array[0..11] of byte; //4790-4801 = 12 bytes
Timbre_Group : array[1..16] of TTimbre_Params; ) // 4802 -4989 = 188 bytes each, 16 Timbres, 4802-7809 = 3008 bytes total for all
end;
首先,需要为
directmode
字段留出空间。如果您确实希望记录的大小为7810字节,则应删除该字段。另一个字节是由于变量记录的false
部分的内部对齐和填充。我还不太清楚它是从哪里来的。不管怎样,您只需要使用压缩记录来避免任何填充字节
TKro_Combi = packed record
case boolean of
true : (
data : array[0..7809] of byte
);
false : (
Combi_Name : array[0..23] of char; //24
Gap1 : array[0..63] of byte; // 24-87 (64)
Ins_Effect_Group : array[1..12] of TIns_Effect_Params; //74 each, (Ins_Effect_Data=9 bytes) 74*12 = 888
Mast_Effect_Params : array[0..229] of byte; // 976-1205 : 230 bytes
Vect_Aud__Drum_Params : array[0..97] of byte; //1206-1303 : 98 bytes
Karma_Common : array[0..509] of byte; //1304-1813 : 510 bytes
Karma_Module : array[0..3] of TKarma_Module; //1814-2557 : 744 bytes each Total span 1814 - 4789 = 2976 bytes total
Common_Params : array[0..11] of byte; //4790-4801 = 12 bytes
Timbre_Group : array[1..16] of TTimbre_Params; ) // 4802 -4989 = 188 bytes each, 16 Timbres, 4802-7809 = 3008 bytes total for all
end;
就是这样-谢谢!我不需要directmode变量——我认为它是声明的必要部分。我现在想起了旧的“打包记录”语法。