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=8和n=16.有人可以解释原因吗?数据成员的对齐方式是否相同n=8?
PS:在Win-x64下测试VS2010.
从您链接到的页面:
成员的对齐将在边界上,该边界是n的倍数或成员大小的倍数,以较小者为准.
对于每个成员,它在成员的最佳对齐和包值之间采用最小对齐.在你的榜样成员对齐完全一样的,不管pack(8)和pack(16)由于类型的最优比均小于16.
如果您有一个需要16字节对齐的成员,例如__m128,您将能够找到不同的结果.