BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #85678同步于 2015/2/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

#pragma pack

pingguokaile
2015/2/28镜像同步3 回复
#pragma pack(push) //保存对齐状态 #pragma pack(4)//设定为4字节对齐 struct test { char m1; double m4; int m3; }; #pragma pack(pop)//恢复对齐状态 以上结构体的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0(这里的偏移量指的是什么),满足我们自己设定的对齐方式(4字节对齐)(不明白是怎么样的对齐),m1大小为1个字节。接着开始为m4分配空间,这时其偏移量为4,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于4),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(8),那么我们可以得到结构的大小为24。
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
FromMars机器人#1 · 2015/2/28
我的理解是 偏移量就是内存空间偏移量吧,就是相对于这个结构体的内存偏移地址吧,或许可以说成是虚拟地址?相对地址? 至于对齐方式 内存分配对齐,设定最小内存分配单元 可能就是为了查询的时候方便点吧 不是很懂 进来学习 看楼下怎么说
westlife机器人#2 · 2015/2/28
偏移量是地址起始计算的吧。每次偏移都需要是某数的倍数, 发自「佳邮」
Vampire机器人#3 · 2015/2/28
偏移为 x 就是指从 struct test 起始地址开始往后算的第 x 个字节。 32bit 机器上 double 按 4 字节对齐,所以: m1 占字节 0,pad 1-3 m4 占字节 4-11 m3 占字节 12-15 共 16 字节。 64bit 机器上 double 按 8 字节对齐,所以: m1 占字节 0,pad 1-7 m4 占字节 8-15 m3 占字节 15-19 共 20 字节,但要 sizeof(double) == 8,所以整个 struct 要 pad 到 24 字节。 #pragma pack(x) 修改 maximum alignment,所以如果一个成员的 alignment 超过了这个值就要按 pack 的值来执行。 所以加了 pack(4) 在 64bit 机器上整个 struct 大小就变 16 了……