返回信息流#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。
这是一条镜像帖。来源:北邮人论坛 / cpp / #85678同步于 2015/2/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
#pragma pack
pingguokaile
2015/2/28镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
我的理解是
偏移量就是内存空间偏移量吧,就是相对于这个结构体的内存偏移地址吧,或许可以说成是虚拟地址?相对地址?
至于对齐方式 内存分配对齐,设定最小内存分配单元 可能就是为了查询的时候方便点吧
不是很懂 进来学习 看楼下怎么说
偏移为 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 了……