C++字节对齐问题
解决时间 2021-02-09 15:39
- 提问者网友:暮烟疏雨之际
- 2021-02-09 11:27
#include
using namespace std;
#pragma pack(5)
struct example1
{
short a;
double b;
};
struct example2
{
char c;
example1 struct1;
short e;
};
#pragma pack()
int main()
{
example2 struct2;
cout << sizeof(example1) << endl; //16
cout << sizeof(example2) << endl; //32
cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)
<< endl; //
example1 struct1;
cout<<(unsigned int)(&struct1.b)-(unsigned int)(&struct1)< getchar();
}
请高手详细说说啊,有点不是很清楚,pack(5)这个里面是偶数的话,我还能知道什么意思,请尽量详细些有这方面的链接也可以,谢谢了
最佳答案
- 五星知识达人网友:轻熟杀无赦
- 2021-02-09 12:28
如果是VC编译的话,pack(5) 是无效的,因为只能按偶数对齐。
你如果用VC编译这段程序,会发现编译器报出提示:warning C4086: expected pragma parameter to be '1', '2', '4', '8', or '16'
出现这个warning后,VC就按默认的8字节对齐,因此这个程序同8字节对齐的结果应该是一样的。
全部回答
- 1楼网友:人间朝暮
- 2021-02-09 12:57
我觉得上面两楼说得都有些偏差,与lz想要的答案有少少不一样.
我相信lz的程序是运行在32位系统上.如果运行在64位系统上,那么结果应该是32,而不是16.
32系统上,int为4字节,long为4字节,然后第9个字节上开始排第一个char,第10个字节上排第二个char,直到第14个字节.而对齐内存后,结构的总字节数在这里应该是4的倍数,所以要16字节.
这里牵涉到内存对齐的问题,lz可以去找找资料.
字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
我要举报
大家都在看
推荐资讯