以这个结构为例:
struct Packing
{
int x; // 4-byte align
int y; // 4-byte align
short int z; // 2-byte align
char m; // 1-byte align;
char _pad[1]; // explicit padding
};
这个结构体的大小是12字节。
那么应该将这个结构体存储在结构体大小(12字节)的地址倍数上,还是存储在sizeof(int)的倍数上(结构体成员中最大的对齐要求)?
由于12的倍数也是4(sizeof(int))的倍数,我猜结构体在12的倍数地址上会正确对齐,但如果它是4字节对齐的话,可能会浪费一些空间。
编辑:在地址0x00000012处,该结构体将被对齐,并且它的第一个成员也将被对齐,因为12是4的倍数。 如果将其存储在地址0x00000004处,情况会怎样呢?在这种情况下,结构体的第一个元素将被对齐,但结构体本身会如何对齐呢?
__pad
是一个反向标识符。 - R. Martinho Fernandes