我想强制一个特定的堆分配返回一个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
}我一定是做错了什么。但是什么呢?
发布于 2014-02-20 07:56:23
new操作符为分配空间而调用的分配器“被假定为返回指向存储的指针,该指针针对具有基本对齐的任何类型的对象进行了适当的对齐”(§3.7.4.1/2;引用自§5.3.4/11)。对于您的编译器和环境,alignas(64)可能不是一个“基本的对齐”,所以分配函数不需要考虑它。
因此,它无法调整其结果以满足特殊需求。
alignas类型说明符设计用于处理静态和自动对象。对于这样的对象,如果请求的对齐是基本的,则必须遵守它,在理想情况下,如果编译器不能保证扩展对齐将得到遵守,它将生成错误消息。(不过,我不认为它必须这样做;如果请求了巨大的堆栈对齐,那么gcc和clang都会产生segfault的可执行文件。)
发布于 2014-02-20 07:48:47
请求超出所需的64个字节,然后在分配的空间内生成一个缓存对齐的地址。注意在结束时释放整个分配的内存。
https://stackoverflow.com/questions/21895038
复制相似问题