新运算符 C++17 中的对齐 - Visual Studio

use*_*077 7 c++ alignment new-operator visual-studio

我在 Visual Studio 2017 C++17 中收到以下程序的错误:

#include <iostream>
int main()
{
    using namespace std;
    align_val_t alignment = (align_val_t)1024;
    int* p = new(alignment) int(3);
    cout << (unsigned long long)(p) % 1024;
    delete p;
}
Run Code Online (Sandbox Code Playgroud)

错误 C2956 大小的释放函数“operator delete(void*, size_t)”将被选为放置释放函数

该程序在 gcc-8 中编译没有错误。VS中的程序如何解决?

Zac*_*chB 2

这是 MSVC 中的一个错误,不幸的是,它被作为“低优先级”关闭:https://developercommunity.visualstudio.com/t/using-c17-new-stdalign-val-tn-syntax-results-in-er/528320

解决方法:

  • 直接致电接线员:

    int* p = static_cast<int*>(operator new[](sizeof(int) * 3, align_val_t{1024}));
    
    Run Code Online (Sandbox Code Playgroud)

    但请注意,您还必须调用相应的operator delete[](void* ptr, std::align_val_t al).

  • std::aligned_alloc如果您可以忍受尺寸为对齐方式的倍数这一烦人的要求,请使用该方法。

  • 使用 MSVC 的非标准_aligned_malloc(). 这必须与_aligned_free().

  • 如果您使用的是 x86,请使用_mm_malloc(size, align)from immintrin.h(或仅使用intrin.h)。这也必须与 配对_mm_free(),但可以在 Windows、Linux 和 MacOS 之间移植。