2012-03-26 9 views
3

Ich arbeite mit der Variante Datensatz unten. Die Variableninstanz ist Kro_Combi. SizeOf (Kro_Combi) meldet 7812 Bytes. SizeOf (Kro_Combi.data) meldet 7810 Bytes. Die Summe der SizeOf aller anderen Datenstrukturen, die den "non-directmode" -Fall des Variantensatzes bilden, addiert auch zu 7810 Bytes.Ist mehr Platz für Variantensätze reserviert?

Warum gibt es einen Unterschied von zwei Byte? Ich möchte, dass sich die beiden Varianten genau überlagern.

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; 

Antwort

7

Zunächst einmal muss es Raum für das directmode Feld sein. Wenn Sie wirklich möchten, dass der Datensatz eine Größe von 7810 Byte hat, sollten Sie dieses Feld entfernen. Das andere Byte wird aufgrund der internen Ausrichtung und Auffüllung des false Teils des Variantensatzes sein. Ich kann noch nicht genau herausfinden, woher es kommt. Egal, Sie wollen einfach einen gepackten Datensatz verwenden, um Füllbytes zu vermeiden.

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

Das ist es genau - Danke! Ich brauche die Variable directmode nicht - ich dachte, es wäre ein notwendiger Teil der Deklaration. Ich erinnere mich jetzt an die alte "Packed Record" -Syntax. – tim11g

Verwandte Themen