如何在VS2019中获取数组的任意对齐?

How to get arbitrary alignment of array in VS2019?

本文关键字:任意 对齐 数组 获取 VS2019      更新时间:2023-10-16

此代码没有给出正确的对齐方式:

alignas(4096) int* p = new int[1024];
printf(“%x”, p);

这应该打印

0x......000

末尾有三个零。我无法让它工作。这可能吗?

当前代码正在对齐指针int*以对齐4096字节边界。您要做的是对齐分配的内存new以对齐边界。

执行此操作的唯一标准方法是使用 C++17 或更高版本,将operator newstd::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