永发信息网

C++字节对齐问题

答案:2  悬赏:20  手机版
解决时间 2021-02-09 15:39
#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)这个里面是偶数的话,我还能知道什么意思,请尽量详细些有这方面的链接也可以,谢谢了
最佳答案
如果是VC编译的话,pack(5) 是无效的,因为只能按偶数对齐。
你如果用VC编译这段程序,会发现编译器报出提示:warning C4086: expected pragma parameter to be '1', '2', '4', '8', or '16'
出现这个warning后,VC就按默认的8字节对齐,因此这个程序同8字节对齐的结果应该是一样的。
全部回答
我觉得上面两楼说得都有些偏差,与lz想要的答案有少少不一样. 我相信lz的程序是运行在32位系统上.如果运行在64位系统上,那么结果应该是32,而不是16. 32系统上,int为4字节,long为4字节,然后第9个字节上开始排第一个char,第10个字节上排第二个char,直到第14个字节.而对齐内存后,结构的总字节数在这里应该是4的倍数,所以要16字节. 这里牵涉到内存对齐的问题,lz可以去找找资料. 字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
起点西餐酒吧怎么去啊,有知道地址的么
别人欠我钱,法院也判决了,但是他没有还钱的
z=a*cost+ib*sint (a,b为实常数)怎么表示成直
是香薰炉好还是香薰灯好?为什么?
可乐与水果糖同时吃有什么反应
如果汽车公里数没到但时间到了4s店还会免费保
巴驿轩地址在哪,我要去那里办事
下列过程,不依赖细胞膜的流动性就能完成的是
刚办的光大银行卡开通手机银行和网上银行都登
百年德化购物公园3号口这个地址在什么地方,
本人有个电话号码长时间未用,打过去回复过期
トーションレース这是什么意思?
小鸡素子里有水之后死是怎么回事?
联想笔记本电脑,开机显示屏不亮,但是指示灯
天然的果蔬面膜好还是买来的那种面膜好?
推荐资讯
埃菲尔铁塔 为何不叫钢塔
东方幻想乡有一首歌将人物名全唱出来了,是哪
—Do you like ZhouJielun or Liu Dehua?— .
树上只有一个苹果,地上有六个苹果,所组成的成
居丽亚地板地址有知道的么?有点事想过去
三年前有过一次中国银行的逾期记录,大约有半
想买一款小型车,纠结在C2和飞度之间,我应该
EMS全球邮政特快专递(笔架路)怎么去啊,我要
奶牛梦工场(天龙路店)地址在哪,我要去那里办
成贤教育地址在哪,我要去那里办事
哪个牌子笔记本质量好.价格便宜.
下列能源的形成与太阳辐射无关的是A. 煤炭B.
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?