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

标签 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
}

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

最佳答案

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/

相关文章:

c++ - 'myStateType' 未在此范围内声明,由 #typedef 引起

c++ - std::unordered_map::find 使用不同于 Key 类型的类型?

c++ - 接受可变数量的相同类型的参数

c - 结构末尾未命名位域的用途是什么

c++ - 递归解决方案的动态规划解决方案

c++ - 无法打印更多的 pi 小数

c++ - 什么是无模式对话框窗口的良好设计?

c++ - vector 结构

c++ - 结构大小和内存布局取决于#pragma pack

java - CUDA对齐要求: should I change my data structures?