如何对齐堆中的数组?
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 double
s,或者更多):所以我认为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
和因此内存必须是 free
d 而不是 delete
d).
如果您没有 C++17,那么您需要分配 size + align - 1
个字节而不是 size
,并且 std::align
指针 - 或者使用非标准目标平台上提供的对齐分配函数。
我使用 SIMD
对数组进行了一些操作,所以我需要让它们在内存中对齐。当我将数组放在 stack
上时,我只需这样做就可以了:
#define BUFFER_SIZE 10000
alignas(16) float approxFreqMuls_Float[BUFFER_SIZE];
alignas(16) double approxFreqMuls_Double[BUFFER_SIZE];
但是现在我需要分配更多的内存(比如96k double
s,或者更多):所以我认为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
和因此内存必须是 free
d 而不是 delete
d).
如果您没有 C++17,那么您需要分配 size + align - 1
个字节而不是 size
,并且 std::align
指针 - 或者使用非标准目标平台上提供的对齐分配函数。