是否为变体记录分配了额外的空间?

时间:2012-03-26 16:26:11

标签: delphi record

我正在使用下面的变体记录。变量实例是Kro_Combi。 SizeOf(Kro_Combi)报告7812个字节。 SizeOf(Kro_Combi.data)报告7810个字节。 构成变体记录的“非直接模式”情况的所有其他数据结构的SizeOf的总和也增加到7810字节。

为什么会有两个字节的区别?我想让两个变体完全相互叠加。

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;

1 个答案:

答案 0 :(得分:7)

首先,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;