为什么在具有相似版本gcc的X86和arm中,相同结构的大小计算不同?

Ezi*_*zio 1 c linux gcc arm visual-c++

正如主题所说,我得到了计算相同结构的同一操作的不同结果。结构如下。

struct test
{
  char m1;
  double d1;
}
Run Code Online (Sandbox Code Playgroud)

在Linux的gcc-4.6.3和gcc-4.2中使用sizeof(struct test)计算时,得到的结果为“ 12”。当我在Linux中使用gcc-4.6.1在WinXP中使用VC 6.0时,得到的结果为“ 16”。所以我很困惑,为什么会这样?GCC如何计算结构的大小?

添加:

如答案所示,arm linux需要AAPCS定义的8字节对齐,但是为什么x86中的vc 6.0会得到结果“ 16”?有人使用vc 2003或更高版本来计算吗?

C标准(例如C89 / C99)还定义了什么?

小智 6

双精度总是8个字节长,但是对齐要求因架构而异。在ARM中(显然,从您的示例中),要求是在8字节边界上对齐双精度。

结构始终填充有空间,以使其尺寸成为具有最大对齐要求的字段的倍数。在上面的示例中,编译器将放置m1,然后是3(或7)个填充字节,然后是d1。

令人困惑的是,在x86上,仅将NEEDS对齐为4字节边界,但是GCC可以选择将其对齐为8字节边界以提高性能。从gcc手册页:

-malign-double

-mno-align-double

控制GCC在两个单词边界还是一个单词边界上对齐double,long double和long long变量。在两个字边界上对齐双变量将产生在“奔腾”上运行更快的代码,但会占用更多内存。警告:如果使用-malign-double开关,则包含上述类型的结构将与386的已发布应用程序二进制接口规范进行不同的对齐,并且与在没有该开关的情况下编译的代码中的结构不二进制兼容。