与包含的类型相比,数组在C++中的对齐方式如何?2.

How is an array aligned in C++ compared to a type contained? 2

本文关键字:对齐 方式如 C++ 数组 类型 包含      更新时间:2023-10-16

跟随主题 与包含的类型相比,数组在C++中如何对齐?我做了一个实验。

这是代码:

#include<iostream>
using namespace std;
int main()
{
  const int N = 12;
  {
    float p1[N], p2[N];
    cout << p1 << " " << p2 << " " << p2 - p1 << endl;
  }
  {
    float* p1, *p2;
      // allocate memory
    p1 = new float[N];
    p2 = new float[N];
    cout << p1 << " " << p2 << " " << p2 - p1 << endl;
    delete[] p1;
    delete[] p2;
  }
}

根据引用的问题和维基,我希望 p1 和 p2 的大小(浮点数)== 4 个字节对齐。但结果是:

0x7fff4fd2b410 0x7fff4fd2b440 12
0x7f8cc9c03bd0 0x7f8cc9c03c00 12

当 N = 9、11 和 12 时,数组之间的距离相同 12。对于 N = 8,距离 (p2-p1) 为 8。所以看起来浮点数组是 16 个字节对齐的。为什么?

附言我的处理器是英特尔酷睿i7

编译器 - g++ 4.6.3


看起来将数组放在一个结构中可以获得 10 个浮点距离:

const int N = 10;
struct PP{
  float p1[N], p2[N];
};
int main() {
  PP pp;
  cout << pp.p1 << " " << pp.p2 << " " << pp.p2 - pp.p1 << endl;
}
0x7fff50139440 0x7fff50139468 10

operator new分配的内存始终对任何对象类型具有合适的对齐方式,无论创建的实际类型如何。此外,它还可能具有更宽的对齐方式(例如,与缓存行对齐)以提高性能。

如果你用自动数组替换你的动态数组(或者更好的是,使它们成为类的连续成员),那么你可能会看到更窄的对齐方式。或者你可能没有;对象如何对齐的确切细节取决于编译器,只要它满足类型的最低要求即可。