Chinaunix

标题: 结构体中double类型的成员的对齐 [打印本页]

作者: is68    时间: 2016-05-16 13:38
标题: 结构体中double类型的成员的对齐
本帖最后由 is68 于 2016-05-16 13:39 编辑

struct A
{
   char     a;
   double  b;
   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
编译到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
回复 7# yulihua49

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

我不是改这个东西,我从来不改这个。只是测出来按他的规矩用。
作者: fender0107401    时间: 2016-06-02 11:28
我从来没考虑过“对齐”的问题,这个在实际当中很重要吗?
作者: hellioncu    时间: 2016-06-02 11:58
fender0107401 发表于 2016-06-02 11:28
我从来没考虑过“对齐”的问题,这个在实际当中很重要吗?


若跨进程通过网络、文件等交换二进制数据,一般就得考虑这个问题
作者: fender0107401    时间: 2016-06-02 13:19
hellioncu 发表于 2016-06-02 11:58
若跨进程通过网络、文件等交换二进制数据,一般就得考虑这个问题


多谢。
作者: yulihua49    时间: 2016-06-03 10:14
fender0107401 发表于 2016-06-02 13:19
多谢。

如果在传输和存储时对数据序列化,就可以不管这个。但是,你要写一个通用的结构体序列化/反序列化工具,就得关心这个。
作者: fender0107401    时间: 2016-06-03 13:18
yulihua49 发表于 2016-06-03 10:14
如果在传输和存储时对数据序列化,就可以不管这个。但是,你要写一个通用的结构体序列化/反序列化工具,就 ...


我一直都是靠序列化的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2