#pragma pack(16)和#pragma pack(8)的效果总是一样吗?

her*_*tao 3 c++ pragma memory-alignment c-preprocessor preprocessor-directive

我试图通过使用对齐数据成员#pragma pack (n).以下面的例子为例:

#include <iostream>
using namespace std;

#pragma pack(8) // or (16)

struct A
{
    int a;
    char b;
    char c;
    char d;
    char e;
    char f;
    double g;
};
int main()
{
    cout << sizeof(A) << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

两者都打印24#pragma pack(8)#pragma pack(16).根据我的理解,我可以理解n=8数据对齐的结果如下:

Bytes: |1 2 3 4|5|6|7|8|9|10 11 12 13 14 15 16|17 18 19 20 21 22 23 24|
 Data: |a      |b|c|d|e|f|padding             |g                      |
Run Code Online (Sandbox Code Playgroud)

但我无法理解为什么结果仍然24存在n=16.我也尝试过其他的例子,所有的人似乎给了相同的结果的n=8n=16.有人可以解释原因吗?数据成员的对齐方式是否相同n=8

PS:在Win-x64下测试VS2010.

Cor*_*son 6

从您链接到的页面:

成员的对齐将在边界上,该边界是n的倍数或成员大小的倍数,以较小者为准.

对于每个成员,它在成员的最佳对齐和包值之间采用最小对齐.在你的榜样成员对齐完全一样的,不管pack(8)pack(16)由于类型的最优比均小于16.

如果您有一个需要16字节对齐的成员,例如__m128,您将能够找到不同的结果.