如何对齐堆中的数组?

How to align arrays in the heap?

我使用 SIMD 对数组进行了一些操作,所以我需要让它们在内存中对齐。当我将数组放在 stack 上时,我只需这样做就可以了:

#define BUFFER_SIZE 10000
alignas(16) float approxFreqMuls_Float[BUFFER_SIZE];
alignas(16) double approxFreqMuls_Double[BUFFER_SIZE];

但是现在我需要分配更多的内存(比如96k doubles,或者更多):所以我认为heap是这样;但是当我这样做时:

int numSteps = 96000;
alignas(16) float *approxFreqMuls_Float = new float[numSteps];
alignas(16) double *approxFreqMuls_Double = new double[numSteps];

它在 ostream 上抛出错误。不太确定消息(我在 MSVC,什么都没有)。

如何在 heap 上分配对齐数组?

默认情况下,堆分配与最大本机对齐对齐,因此只要您不需要过度对齐,就不需要做任何特别的对齐操作。

如果出于某种原因确实需要过度对齐,可以使用对齐的新语法 new (std::align_val_t(16)) float[numSteps];(或 malloc 函数族中的 std::aligned_alloc 和因此内存必须是 freed 而不是 deleted).

如果您没有 C++17,那么您需要分配 size + align - 1 个字节而不是 size,并且 std::align 指针 - 或者使用非标准目标平台上提供的对齐分配函数。