2014-06-25 18 views
6

Ich verstehe, dass das align Attribut eine few different Form der Verwendung hat. wobei gepolstert mit 2 zusätzlichen unerwünschten BytesVerwirrung in Bezug auf das 'align' Attribut

align(1) 
private struct TGAHeader 
{ 
    ubyte idLenght; 
    ubyte hasColormap; 
    ubyte imageType; 
    ushort cmFirstEntry; 
    ushort cmLength;  
    ubyte cmSize;  
    ushort xOrigin;  
    ushort yOrigin;  
    ushort width;   
    ushort height;   
    ubyte pixelDepth;  
    ubyte imageDescriptor; 
} 

// TGAHeader.sizeof == 20 

, die in der Struktur ergab:

In meinem ersten Versuch, ich benutze es wurde wie folgt.

Nach dem Wechsel es an:

private struct TGAHeader 
{ 
align(1): 
    ubyte idLenght; 
    ubyte hasColormap; 
    ubyte imageType; 
    ushort cmFirstEntry; 
    ushort cmLength;  
    ubyte cmSize;  
    ushort xOrigin;  
    ushort yOrigin;  
    ushort width;   
    ushort height;   
    ubyte pixelDepth;  
    ubyte imageDescriptor; 
} 

// TGAHeader.sizeof == 18 

bekam ich das erwartete 18 Bytes für die Header-Größe.

Also meine Zweifel ist: Was ist die tatsächliche Verwendung der ersten Form der align Attribut, wenn es scheint nicht die Daten auszurichten, wie man erwarten würde?

Antwort

7

Zitat aus dem Link haben Sie gegeben:

Die Ausrichtung für die Felder eines Aggregats hat keinen Einfluss auf die Ausrichtung des Aggregats selbst - das beeinflusst wird durch die Ausrichtung Einstellung außerhalb des Aggregats.

Also richtet das zweite Formular die Felder der Struktur aus. Und das erste richtet die Struktur selbst aus.

In Ihrem Beispiel betrachten wir eine größere Ausrichtung - sagen, von 16. Die erste Form

im folgenden Layout führt
TGAHeader.sizeof     = 32 // the padding was added in the end of the struct 
TGAHeader.idLenght.offsetof  = 0 
TGAHeader.hasColormap.offsetof  = 1 
TGAHeader.imageType.offsetof  = 2 
TGAHeader.cmFirstEntry.offsetof = 4 
TGAHeader.cmLength.offsetof  = 6 
TGAHeader.cmSize.offsetof   = 8 
TGAHeader.xOrigin.offsetof   = 10 
TGAHeader.yOrigin.offsetof   = 12 
TGAHeader.width.offsetof   = 14 
TGAHeader.height.offsetof   = 16 
TGAHeader.pixelDepth.offsetof  = 18 
TGAHeader.imageDescriptor.offsetof = 19 

und die zweite Form

in Folge wird
TGAHeader.sizeof     = 192 // every field was padded 
TGAHeader.idLenght.offsetof  = 0 
TGAHeader.hasColormap.offsetof  = 16 
TGAHeader.imageType.offsetof  = 32 
TGAHeader.cmFirstEntry.offsetof = 48 
TGAHeader.cmLength.offsetof  = 64 
TGAHeader.cmSize.offsetof   = 80 
TGAHeader.xOrigin.offsetof   = 96 
TGAHeader.yOrigin.offsetof   = 112 
TGAHeader.width.offsetof   = 128 
TGAHeader.height.offsetof   = 144 
TGAHeader.pixelDepth.offsetof  = 160 
TGAHeader.imageDescriptor.offsetof = 176