0

遵循主题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 将 sizeof(float) == 4 字节对齐。但结果是:

0x7fff4fd2b410 0x7fff4fd2b440 12
0x7f8cc9c03bd0 0x7f8cc9c03c00 12

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

PS 我的处理器是 Intel Core 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
4

1 回答 1

1

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

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

于 2013-10-21T12:02:58.320 回答