C++ 对齐 new[]

Ale*_*der 11 c++ memory-alignment c++17

概述

当浏览operator new、operator new[] - cppreference.com时,我们似乎有很多选项来分配具有特定对齐要求的对象数组。但是,没有指定如何使用它们,而且我似乎找不到正确的 C++ 语法。

我可以以某种方式显式调用该运算符,还是编译器会自动推断重载?:

void* operator new[]( std::size_t count, std::align_val_t al );
Run Code Online (Sandbox Code Playgroud)

看看Bartek的编码博客,似乎编译器会根据对齐要求是否大于__STDCPP_DEFAULT_NEW_ALIGNMENT__(在64位机器上通常为16)自动选择重载。

问题

在某些情况下是否可以手动为new操作员选择重载?有时我可能希望分配的块以某种方式对齐(我假设对齐始终是 2 的幂,并且可能大于 16)。

编译器的选择

在可预见的将来,我可能会使用 GCC 和 C++ >= 17。

Fat*_*KIR 19

附加参数operator new在类型之前的括号内传递:

#include <new>

int* allocate() {
    return new (std::align_val_t(16)) int[40]; // 128-bit alignment
    // will call `void* operator new[](size_t, align_val_t)`
}
Run Code Online (Sandbox Code Playgroud)

  • @ワイきんぐ,我看不出它不起作用的明显原因。libcxx 实现 (https://github.com/llvm/llvm-project/blob/master/libcxx/src/new.cpp#L175) 使用提供的对齐方式调用对齐的 malloc 实现。如果提供的对齐方式小于指针对齐方式,则会向上移动。 (2认同)