2012-03-26 17 views
3

以下のバリアントレコードで作業しています。変数インスタンスはKro_Combiです。 SizeOf(Kro_Combi)は7812バイトを報告します。 SizeOf(Kro_Combi.data)は7810バイトを報告します。 バリアントレコードの「非ダイレクトモード」の大文字小文字を構成する他のすべてのデータ構造のSizeOfの合計も7810バイトになります。バリアントレコードに余分なスペースが割り当てられていますか?

なぜ2バイトの違いがありますか?私は2つの変種をお互いに正確に重ね合わせたいと思っています。

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; 

答えて

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; 
+0

これはまさにそれです - ありがとう!私はdirectmode変数の必要はありません - 私はそれが宣言の必要な部分だと思っていました。私は今、古い "パックレコード"の構文を覚えています。 – tim11g