如何在`C++17`中调用重载对齐的new和delete运算符?

Nik*_*kos 4 c++ overloading alignment new-operator delete-operator

cppreference我们可以看到几个新的过载newdelete,以及new[]delete[]添加。我在 cppreference 或其他任何地方都找不到任何使用新对齐重载的示例。我已经对它们进行了一段时间的试验,但我不知道如何触发这些对齐的动态分配的调用。任何人都有任何想法,请分享一个例子。

Ant*_*ock 5

您需要在类型上指定 align as 关键字,然后正常调用 new 和 delete 。我在这里整理了一篇带有示例的文章:https : //github.com/Twon/Alignment/blob/master/docs/alignment_in_C%2B%2B.md。一个例子是:

#include <memory>

int main() {
    class alignas(16) float4 {
        float f[4];
    }; 

    std::unique_ptr<float4 > aligned_vec4(std::make_unique<float4 >());
}
Run Code Online (Sandbox Code Playgroud)

以及英特尔编译器的示例,该编译器目前通过aligned_new 扩展头文件提供此功能:https ://software.intel.com/en-us/articles/aligned-operator-new-support-in-intel-c-compiler

  • `aligned_new` 不是来自 C++ 标准的头文件。在 C++17 中,_new expression_ 将自动使用特殊版本的 `operator new` 来处理过度对齐的类型。AFAIK,直到 C++17,没有可移植的方式如何为过度对齐的对象动态分配内存。通常,使用`posix_memalign` 或类似的特定于平台的函数。 (2认同)