c-如何使用alignof强制对齐堆分配?
作者:互联网
我想强制特定的堆分配返回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运算符调用以分配空间的分配器“假定将指针返回到已针对具有基本类型的任何类型的对象适当对齐的存储
对齐”(第3.7.4.1/2节;引自第5.3.4 / 11节).alignas(64)可能不是您的编译器和环境的“基本对齐方式”,因此分配函数不需要尊重它.
请注意,分配函数仅传递请求的空间量;它不知道要求什么对齐方式.因此,它无法调整其结果以适应特殊需要.
alignas类型说明符旨在与静态和自动对象一起使用.对于此类对象,如果请求的对齐方式是基本的,则必须遵守该要求,并且在理想情况下,如果编译器无法保证会遵守扩展的对齐方式,则将生成一条错误消息. (不过,我不认为这样做是必须的;如果要求进行大的堆栈对齐,则gcc和clang都将生成可执行文件,这些文件会发生段错误.)
标签:c,c11,memory-alignment 来源: https://codeday.me/bug/20191012/1901665.html