结构体中double类型的成员的对齐
本帖最后由 is68 于 2016-05-16 13:39 编辑struct A
{
char a;
doubleb;
int c;
char d;
};
测试出 sizeof(A) = 20
为什么会是20? 不是应该是8的倍数吗? 难道不是4+4+8+4吗? 这个好像跟编译器相关,8字节的double,有的8字节对齐,有的4字节对齐 本帖最后由 is68 于 2016-05-16 14:15 编辑
编译到ARM中时,是按8个对齐, 和我理解的内存对齐是一样的。 但是在Ubuntu中编译是按4个字节对齐,所以有点不明白。
例:
ARM:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
----------------------------------------------------------------------------------------------
a b c d End ->24个字节
Unbu: a b c d end -> 20个字节
is68 发表于 2016-05-16 14:12 static/image/common/back.gif
编译到ARM中时,是按8个对齐, 和我理解的内存对齐是一样的。 但是在Ubuntu中编译是按4个字节对齐,所以有点 ...
gcc的话,好像编译成64位时,按8字节,32位时,按4字节 本帖最后由 windoze 于 2016-05-16 23:44 编辑
SysV ABI规定,x86-32位程序中double按4字节对齐。GCC下你可以用-malign-double或者-mno-align-double控制double的对齐方式。
64位程序中double都是按8字节对齐。 本帖最后由 yulihua49 于 2016-05-19 13:51 编辑
回复 6# windoze
每个编译器都不同。我是要测定一下。
struct D_ali {
char a;
double b;
} dali;
&dali.b-&dali.a
回复 7# yulihua49
我说的是OS标准ABI,你当然可以用参数去改这些东西。 windoze 发表于 2016-05-19 14:46 static/image/common/back.gif
回复 7# yulihua49
我说的是OS标准ABI,你当然可以用参数去改这些东西。
我不是改这个东西,我从来不改这个。只是测出来按他的规矩用。 我从来没考虑过“对齐”的问题,这个在实际当中很重要吗?{:yct5:}
页:
[1]
2