C++ 如何在堆中对齐数组?

C++ 如何在堆中对齐数组?,c++,arrays,heap,simd,memory-alignment,C++,Arrays,Heap,Simd,Memory Alignment,我使用SIMD对数组执行一些操作,因此需要在内存中对齐它们。当我在堆栈上放置数组时,我只需这样做,它就可以工作了: #define BUFFER_SIZE 10000 alignas(16) float approxFreqMuls_Float[BUFFER_SIZE]; alignas(16) double approxFreqMuls_Double[BUFFER_SIZE]; 但是现在我需要分配更多的内存(比如96kdoubles,或者更多):所以我认为堆就是这样;但当我这么做的时候: i

我使用
SIMD
对数组执行一些操作,因此需要在内存中对齐它们。当我在
堆栈上放置数组时
,我只需这样做,它就可以工作了:

#define BUFFER_SIZE 10000
alignas(16) float approxFreqMuls_Float[BUFFER_SIZE];
alignas(16) double approxFreqMuls_Double[BUFFER_SIZE];
但是现在我需要分配更多的内存(比如96k
double
s,或者更多):所以我认为
堆就是这样;但当我这么做的时候:

int numSteps = 96000;
alignas(16) float *approxFreqMuls_Float = new float[numSteps];
alignas(16) double *approxFreqMuls_Double = new double[numSteps];
它在
ostream
上抛出错误。不太确定消息(我在
MSVC
,没什么可怕的)


如何在
堆上分配对齐的数组?

默认情况下,堆分配与最大本机对齐对齐,因此只要不需要过度对齐,就不需要执行任何特定操作来对齐

如果确实需要过度对齐,出于某种原因,可以使用对齐的新语法
new(std::align_val_t(16))float[numSteps]
(或
std::aligned_alloc
,它位于
malloc
函数系列中,因此内存必须是
空闲的
d,而不是
delete
d)


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

堆分配默认与最大本机对齐
这意味着什么?不应该使用SIMD与16对齐?i、 e._umm_load_pd(mem_addr必须在16字节边界上对齐,否则可能会生成一般保护异常)。事实上,如果我删除对齐,它也会崩溃:)@markzzz这意味着(无论为
new
指定的类型如何),除了那些使用
alignas
且值大于
alignof(std::max\u align\u t)
的类型(即过度对齐的类型),内存将充分对齐任何和所有类型。如果“最大本机对齐”为16,则所有人都很好。如果较小,则需要过度对齐。如果您需要特定的对齐方式,但不知道本机对齐方式,则使用对齐分配是一个安全的选择。如何检查打印8的“最大本机对齐方式”。所以我想我需要
过度对齐