与包含的类型相比,数组在C++中的对齐方式如何?2.
How is an array aligned in C++ compared to a type contained? 2
跟随主题 与包含的类型相比,数组在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
分配的内存始终对任何对象类型具有合适的对齐方式,无论创建的实际类型如何。此外,它还可能具有更宽的对齐方式(例如,与缓存行对齐)以提高性能。
如果你用自动数组替换你的动态数组(或者更好的是,使它们成为类的连续成员),那么你可能会看到更窄的对齐方式。或者你可能没有;对象如何对齐的确切细节取决于编译器,只要它满足类型的最低要求即可。
相关文章:
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 具有调整对齐方式的类型定义
- size_t的大小和对齐方式是否与ptrdiff_t相同?
- 逗号运算符在对齐方式中
- vcpkg:指定结构成员对齐方式
- 使用字节数组具有单字节对齐方式的结构是否安全
- C++对齐方式(何时使用对齐方式)
- 编译器会秘密增加结构的对齐方式吗?
- C++17 中函数参数的指针对齐方式
- 未在此范围内声明的对齐方式?
- 如何控制 clang 格式新行中 lessless 的对齐方式
- C++ 编译器正在更改我的结构的对齐方式.我怎样才能防止这种情况
- 是否有符合标准的方法来确定非静态杆件的对齐方式?
- 重载运算符是具有较小默认对齐方式的新增运算符
- 结构和对齐方式的大小
- Sizeof 舍入到对齐方式,但编译器仍将对象放在剩余的字节中
- 是否可以让 std::vector<char> 使用选定的内存对齐方式分配内存
- 对齐方式与指针中尾随零的数量有何关系
- 对齐方式究竟如何影响内存布局和新放置的巴哈维?
- 幻影类型是否与原始类型具有相同的对齐方式