2014-06-25 23 views
6

Rozumiem, że atrybut align ma postać użycia few different.Zamieszanie dotyczące atrybutu "wyrównaj"

W mojej pierwszej próbie, używałem go w następujący sposób:

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 

w wyniku których struktury są wyściełane z 2 dodatkowych niechcianych bajtów.

Po wymianie go na adres:

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 

mam oczekiwanych 18 bajtów dla rozmiaru nagłówka.

Tak więc mam wątpliwości: jaki jest faktyczny użytek z pierwszej formy atrybutu align, jeśli nie wydaje się, aby dane były wyrównane, jak można by oczekiwać?

Odpowiedz

7

Cytat link dałeś:

Wyrównanie dla pól agregatu nie wpływa na wyrównanie samego kruszywa - to zależy od ustawienia wyrównania na zewnątrz agregatu.

Drugi formularz wyrównuje pola struktury. I pierwszy wyrównuje samą strukturę.

W przykładzie, należy rozważyć większe wyrównanie - powiedzmy, od 16. Pierwsza forma spowoduje następujący układ

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 

i drugą formę spowoduje

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