如何使用alignof强制对齐堆分配
How use alignof to force alignment for a heap allocation?
我想强制特定的堆分配返回一个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个字节,然后在分配的空间内生成一个与缓存对齐的地址。最后注意释放所有分配的内存。
相关文章:
- 使 std::vector 分配对齐内存的现代方法
- Linux C++ 中的页面对齐内存分配
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 具有对齐存储的动态内存分配
- 为什么动态分配的内存总是16字节对齐
- C - 将所有分配的双阵列对齐至32 bytes
- C++:分配对齐的矩阵
- 在以下情况下,是否可以分配未对齐的对象?
- 如何分配内存对齐C++对象数组?
- 是否可以让 std::vector<char> 使用选定的内存对齐方式分配内存
- 在堆栈上分配对齐的内存,如_alloca
- 读取 /编写部分分配的对齐内存
- 正在分配初始化的、对齐的内存
- 如何强制对齐堆分配的对象
- 如何使用alignof强制对齐堆分配
- 对齐的成员变量和动态分配
- c++堆分配默认为32字节对齐
- 堆分配变量的结构成员对齐
- clang格式的对齐分配是否损坏