如何在VS2019中获取数组的任意对齐?
How to get arbitrary alignment of array in VS2019?
此代码没有给出正确的对齐方式:
alignas(4096) int* p = new int[1024];
printf(“%x”, p);
这应该打印
0x......000
末尾有三个零。我无法让它工作。这可能吗?
当前代码正在对齐指针int*
以对齐4096
字节边界。您要做的是对齐分配的内存new
以对齐边界。
执行此操作的唯一标准方法是使用 C++17 或更高版本,将operator new
与std::aligned_val_t
参数一起使用,或std::aligned_alloc
。例如:
int* p = new(std::align_val_t{4096}) int[1024];
...
delete [] p;
// or a more C-style way
int* p = static_cast<int*>(std::aligned_alloc(4096, sizeof(int)*1024));
...
std::free(p);
下面是在编译器资源管理器上使用 GCC 的工作示例;此处是 MSVC 失败的相同示例。
如果不使用 C++17,则需要使用特定于操作系统的对齐分配函数,例如posix_memalign
适用于符合 POSIX 的操作系统,或 Windows 上的_aligned_malloc
。
或者,如果您的系统安装了 C11 接头,则可以使用<stdlib.h>
中定义的 C 标准aligned_alloc
。这与std::aligned_alloc
等效项相同,只是std::
命名空间限定的命名空间仅保证在 C++17 或更高版本中可用。
编辑:MSVC似乎不允许使用operator new
,因为他们认为标准中的歧义(有关更多详细信息,请参阅此处的评论部分(。如果您正在使用 MSVC,或者正在寻找最可移植的代码 - 您应该改用std::aligned_alloc
。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- Linux C++ 中的页面对齐内存分配
- C++ 类层次结构中的"对齐"是什么意思?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 如何在VS2019中获取数组的任意对齐?
- 使用char数组来容纳任意大小对象的数组,对齐问题