内部只有这种基本类型的基本类型和结构的对齐

时间:2013-05-21 18:12:36

标签: c++ alignment

有这段代码:

#include <iostream>

struct A {
   double a;
};

int main(){
   std::cout << alignof(A) << std::endl; // prints 4
   std::cout << alignof(double) << std::endl; // prints 8
   return 0;
}

为什么结构A和原始double类型的对齐方式不同?我正在使用Linux 32位。

1 个答案:

答案 0 :(得分:3)

我在这里找到了一个可能的解释:Implementation of alignof

  

有关对齐的惊人事实

     

在现代x86处理器上,double类型最有效地以8的倍数对齐。实际上,gcc在堆栈帧中以8的倍数对齐“free”双精度。不幸的是,古老的ABI要求结构中double的对齐是4.意外的结果是,在x86 Linux上,gcc已经

  struct Double { double d; };
  __alignof__ (double) == 8
  __alignof__ (Double) == 4;
     

同样古老的ABI指出long double的大小是12.因为对齐必须是大小的一个因素,我们有一个奇怪的情况:

  __alignof__ (double) == 8
  __alignof__ (long double) == 4;
     

尽管long double“想要”至少与double一致。

     

幸运的是,它并不重要,因为我们从不关心非结构成员类型的对齐。