C++按其结构大小或最大对齐要求对齐?

Tia*_*sta 3 c++ memory

以此结构为例:

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
};
Run Code Online (Sandbox Code Playgroud)

此结构的大小为12个字节.

那么应该将此结构存储在结构大小(12字节)的倍数或sizeof(int)的倍数中(结构成员中最大的对齐要求)?

由于12的倍数也是4的倍数(sizeof(int)),我猜结构将在12的地址倍数中正确对齐,但如果是4字节对齐,我可能会浪费不会浪费的空间.

编辑:在地址0x00000012处,结构将对齐,其第一个成员也将对齐,因为12是4的倍数.如果将其存储在地址0x00000004?在这种情况下,结构的第一个元素将是对齐的,但结构本身呢?

Nec*_*lis 5

如果您想在任何英特尔CPU上调整性能,您应该遵循英特尔优化手册中的这些指导原则:

为获得最佳性能,请按如下方式对齐数据

•在任何地址对齐8位数据.

•将16位数据对齐,使其包含在对齐的4字节字中.

•对齐32位数据,使其基址为四的倍数.

•对齐64位数据,使其基址为8的倍数.

•对齐80位数据,使其基址为16的倍数.

•对齐128位数据,使其基址为16的倍数.

所以在你的情况下,你将对齐16,而不是 4或8,因为你的结构长度在64到128位之间,16是最好的上部拟合,它还启用了一些其他额外的东西,比如能够使用SIMD来复制结构.