c++ - 如何对齐堆中的数组?

标签 c++ arrays heap-memory simd memory-alignment

<分区>

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

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

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

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

它在 ostream 上抛出错误。不太确定该消息(我在 MSVC 上,没有任何东西)。

如何在上分配对齐数组?

最佳答案

默认情况下,堆分配与最大 native 对齐对齐,因此只要您不需要过度对齐,就不需要做任何特别的事情来对齐它。

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

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

关于c++ - 如何对齐堆中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54590668/

相关文章:

c++ - 如何修改/分配矩阵元素值?

scala 从 Stream[String] => 超出 GC 开销限制分割字符串

C++堆组织——哪种数据结构?

c++ - C 链表 - 不允许指向不完整类的指针

c++ - VirtualProtect 是否需要页面开头的地址?

arrays - 距离可被整数整除的点对

java - 如何判断数组中任意值的总和是否等于n

python - 从 np.empty 初始化 numpy 数组

c++ - 如何设置整数的区间?

c++ - make_signed<unsigned long>::type 是 int?