#pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

2024-05-09

我正在尝试使用来对齐数据成员#pragma pack (n) http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.100%29.aspx。以下面为例:

#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;
}

两者都会打印24 for #pragma pack(8) and #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                      |

但我不明白为什么结果仍然是24 for n=16。我还尝试了其他示例,所有这些示例似乎都给出了相同的结果n=8 and n=16。有人可以解释为什么吗?数据成员的对齐方式是否与n=8?

P.S.:在 Win-x64 下的 VS2010 中测试。


从您链接到的页面:

成员的对齐将位于边界上,该边界是 n 的倍数或成员大小的倍数,以 较小。

对于每个成员,它采用成员的最佳对齐和包值之间的最小对齐。您的示例中的成员对齐完全相同,无论pack(8) and pack(16)因为类型的最佳对齐方式都小于 16。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗? 的相关文章