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

How use alignof to force alignment for a heap allocation?

本文关键字:对齐 分配 何使用 alignof      更新时间:2023-10-16

我想强制特定的堆分配返回一个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都会生成可执行文件,如果需要进行大规模的堆栈对齐,这些可执行文件就会出错。)

请求比您需要的多64个字节,然后在分配的空间内生成一个与缓存对齐的地址。最后注意释放所有分配的内存。