gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:48:32 30 4
gpt4 key购买 nike

我正在尝试使用 #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;
}

两者都将为 #pragma pack(8)#pragma pack(16) 打印 24。根据我的理解,我可以通过数据对齐来理解 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 |

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

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

最佳答案

从您链接到的页面:

The alignment of a member will be on a boundary that is either a multiple of n or a multiple of the size of the member, whichever is smaller.

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

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

关于c++ - #pragma pack(16) 和#pragma pack(8) 的效果总是一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22754240/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com