如何使用alignof强制堆分配对齐?

时间:2014-02-19 23:40:35

标签: c++ c++11 memory-alignment

我想强制一个特定的堆分配来返回一个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
}

我一定是做错了。但是什么?

2 个答案:

答案 0 :(得分:2)

new运算符调用以分配空间的分配器“假定返回指向适合任何类型的对象的存储的指针。 alignment“(§3.7.4.1/ 2;引用来自§5.3.4/ 11)。alignas(64)可能不是你的编译器和环境的”基本对齐“,所以分配函数不需要尊重它

请注意,分配功能仅传递请求的空间量;它不知道正在请求什么对齐。因此,它无法调整其结果以满足特殊需求。

alignas类型说明符用于处理静态和自动对象。对于这样的对象,如果它是基本的,则必须遵守所请求的对齐,并且在理想的世界中,如果编译器不能保证将遵守扩展的对齐,则将产生错误消息。 (我不相信它有必要这样做; gcc和clang都会生成可执行文件,如果请求了大量的堆栈对齐,则会出现段错误。)

答案 1 :(得分:1)

请求超过您需要的64个字节,然后在分配的空间内生成缓存对齐的地址。注意最后释放整个分配的内存。