3

有这个代码:

#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 位。

4

1 回答 1

3

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

关于对齐的惊人事实

在现代 x86 处理器上,double 类型以 8 的倍数对齐最有效。事实上,gcc 在堆栈帧内以 8 的倍数对齐“自由”双精度。不幸的是,古老的 ABI 要求结构中双精度数的对齐方式为 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 一样对齐。

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

于 2013-05-21T18:21:57.517 回答