Путаница в отношении 'выровнять' атрибут

Я понимаю, что есть несколько разные форма использования.

в моей первой попытке я использовал его следующим образом:

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

в результате которых в struct, будучи дополнен 2 лишних ненужных байтов.

после изменения это:

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

Я получил ожидаемые 18 байтов для размера заголовка.

поэтому я сомневаюсь: каково фактическое использование первой формы align атрибут, если он не кажется чтобы выровнять данные, как можно было бы ожидать?

1 ответов


цитата из ссылки, которую вы дали:

выравнивание полей агрегата не влияет на выравнивание самого агрегата - на это влияет настройка выравнивания вне агрегата.

Итак, вторая форма выравнивает поля структуры. И первый выравнивает саму структуру.

в вашем примере рассмотрим большее выравнивание - скажем, 16. Первая форма приведет к следующему: макет

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

и вторая форма приведет в

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