我想强制一个特定的堆分配来返回一个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
}
我一定是做错了。但是什么?
答案 0 :(得分:2)
由new
运算符调用以分配空间的分配器“假定返回指向适合任何类型的对象的存储的指针。
alignment“(§3.7.4.1/ 2;引用来自§5.3.4/ 11)。alignas(64)
可能不是你的编译器和环境的”基本对齐“,所以分配函数不需要尊重它
请注意,分配功能仅传递请求的空间量;它不知道正在请求什么对齐。因此,它无法调整其结果以满足特殊需求。
alignas
类型说明符用于处理静态和自动对象。对于这样的对象,如果它是基本的,则必须遵守所请求的对齐,并且在理想的世界中,如果编译器不能保证将遵守扩展的对齐,则将产生错误消息。 (我不相信它有必要这样做; gcc和clang都会生成可执行文件,如果请求了大量的堆栈对齐,则会出现段错误。)
答案 1 :(得分:1)
请求超过您需要的64个字节,然后在分配的空间内生成缓存对齐的地址。注意最后释放整个分配的内存。