为什么有这个特性
C++的范式是使用new
和 delete
来分配与释放内存。这与C中的malloc
和free
对应。
在使用SIMD指令时,要求数据源存储在满足特定对齐条件的内存段中。这在C中是通过aligned_alloc
实现的。然而,C++的范式中没有与aligned_alloc
对应的东西。
因此,aligned_new
就呼之欲出了。
使用
根据 C++ Standards Support in GCC,特性Dynamic memory allocation for over-aligned data
在GCC7中支持,因此首先要做的是安装g++-7
。
此外,在编译选项中,需要加入-std=c++17
。
最后,新特性的使用比较奇妙。在 cppreference 中,新特性对应的接口是:void* operator new[](std::size_t count, std::align_val_t al)
,因此使用的方式为:
// Filename: main.cpp
#include <new>
int main () {
int* p = new((std::align_val_t) 64) int[100];
delete[] p;
}
编译命令为:$ g++-7 -std=c++17 main.cpp
为什么说它比较奇妙呢?符合直觉的用法当然是int* p = new(64) int[100];
。这让我找各种原因找了一下午,发现最后是一个类型问题。