is68 发表于 2016-05-16 13:38

结构体中double类型的成员的对齐

本帖最后由 is68 于 2016-05-16 13:39 编辑

struct A
{
   char   a;
   doubleb;
   int      c;
   char      d;
};

测试出 sizeof(A) = 20
为什么会是20? 不是应该是8的倍数吗?

w413276727 发表于 2016-05-16 13:59

难道不是4+4+8+4吗?

hellioncu 发表于 2016-05-16 14:12

这个好像跟编译器相关,8字节的double,有的8字节对齐,有的4字节对齐

is68 发表于 2016-05-16 14:12

本帖最后由 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个字节

hellioncu 发表于 2016-05-16 14:15

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:43

本帖最后由 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:48

本帖最后由 yulihua49 于 2016-05-19 13:51 编辑

回复 6# windoze
每个编译器都不同。我是要测定一下。
struct D_ali {
         char a;
         double b;
} dali;

&dali.b-&dali.a






   

windoze 发表于 2016-05-19 14:46

回复 7# yulihua49

我说的是OS标准ABI,你当然可以用参数去改这些东西。

yulihua49 发表于 2016-06-01 23:10

windoze 发表于 2016-05-19 14:46 static/image/common/back.gif
回复 7# yulihua49

我说的是OS标准ABI,你当然可以用参数去改这些东西。
我不是改这个东西,我从来不改这个。只是测出来按他的规矩用。

fender0107401 发表于 2016-06-02 11:28

我从来没考虑过“对齐”的问题,这个在实际当中很重要吗?{:yct5:}
页: [1] 2
查看完整版本: 结构体中double类型的成员的对齐