我想强制特定的堆分配返回一个 64 字节对齐的地址,因为这是缓存行边界。我以为我可以这样做
int *p = new alignas(64) int;
但我的编译器似乎都没有给 p
一个 64 的倍数的地址。这是我检查的方式:
#include <iostream>
int main()
{
int *p = new alignas(64) int;
std::cout << long(p) % 64 << '\n'; // should print 0
}
我一定是做错了什么。但是什么?
最佳答案
new
运算符调用的分配器分配空间“假定返回指向存储的指针,该存储与基本的任何类型的对象适当对齐
alignment”(§3.7.4.1/2;引用自 §5.3.4/11)。alignas(64)
可能不是您的编译器和环境的“基本对齐”,因此分配函数不需要尊重它。
请注意,分配函数仅传递请求的空间量;它不知道请求的对齐方式是什么。因此,它无法调整其结果以满足特殊需要。
alignas
类型说明符设计用于静态和自动对象。对于这样的对象,如果它是基本的,则必须遵守请求的对齐方式,并且在理想的世界中,如果编译器不能保证遵守扩展对齐方式,则会产生错误消息。 (不过,我不认为它有义务这样做;gcc 和 clang 都会生成可执行文件,如果请求大量堆栈对齐,就会出现段错误。)
关于c++ - 如何使用 alignof 强制对齐堆分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895038/