返回信息流struct S3 {
char c;
int i[2];
double v;
};
看《深入理解操作系统》,里面说到内存对齐,在x86 64系统,假设c的起始地址是0,那么i的偏移是4,v的偏移是16。
如果按4对齐,为啥v的偏移不是12?
如果按8对齐,为啥i的偏移不是8?
这是一条镜像帖。来源:北邮人论坛 / cpp / #97836同步于 2018/7/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于内存对齐
xiaobing307
2018/7/8镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
int好像是4字符,所以虽然前面只有一个char也要从4的倍数的地址开始,所以偏移是4,两个int就是4+8=12。同样的,double是8个字符,所以要从8的倍数的地址开始,所以偏移地址是离12最近的8的倍数,就是16了。
如果按4对齐,为啥v的偏移不是12?
用#pragma pack (4)之后v为啥不是12?
v的对齐按照min(缺省的4,sizeof(double))=4,来计算的话,就可以存在12啊
如果按8对齐,为啥i的偏移不是8?
i的对齐按照 min(缺省的8,sizeof(int))=4来对齐,所以可以放在4
大小和对齐是由ABI决定的。https://wiki.osdev.org/System_V_ABI
如果你用x86_64和linux的话,看这个:https://www.uclibc.org/docs/psABI-x86_64.pdf
【 在 xiaobing307 的大作中提到: 】
: [code=c]
: struct S3 {
: char c;
: ...................
typedef struct __test {
char c;
int i[2];
double v;
} test;
&test &test.c &test.i[0] &test.v
0x7ffee0a77a80 0x7ffee0a77a80 0x7ffee0a77a84 0x7ffee0a77a90
--------------------------------------------------------------------------
typedef struct __test {
char c;
// int i[2];
char i[8];
double v;
} test;
&test &test.c &test.i[0] &test.v
0x7ffeeda90aa0 0x7ffeeda90aa0 0x7ffeeda90aa1 0x7ffeeda90ab0
--------------------------------------------------------------------------
typedef struct __test {
char c;
// int i[2];
char i[8];
// double v;
int v[2];
} test;
&test &test.c &test.i[0] &test.v[0]
0x7ffee28b7ab0 0x7ffee28b7ab0 0x7ffee28b7ab1 0x7ffee28b7abc
--------------------------------------------------------------------------
typedef struct __test {
char c;
// int i[2];
char i[8];
// double v;
char v[8];
} test;
&test &test.c &test.i[0] &test.v[0]
80x7ffee414faa0 0x7ffee414faa0 0x7ffee414faa1 0x7ffee414faa9
测试环境x64 + clang,sizeof(int) == 4,sizeof(double) == 8
***************************************************************************
x86-64 CentOS 7 ABI 2.6.32
【 在 shan10211865 的大作中提到: 】
: 如果按4对齐,为啥v的偏移不是12?
: 用#pragma pack (4)之后v为啥不是12?
: v的对齐按照min(缺省的4,sizeof(double))=4,来计算的话,就可以存在12啊
: ...................
https://github.com/ludx/The-Lost-Art-of-C-Structure-Packing#%E5%AF%B9%E9%BD%90%E8%A6%81%E6%B1%82
刚刚 google 出来的