Ezi*_*zio 1 c linux gcc arm visual-c++
正如主题所说,我得到了计算相同结构的同一操作的不同结果。结构如下。
struct test
{
  char m1;
  double d1;
}
在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的已发布应用程序二进制接口规范进行不同的对齐,并且与在没有该开关的情况下编译的代码中的结构不二进制兼容。