我正在现代化/更新一些最初用 C 编写但现在在 C++ 代码库中使用的旧代码(不需要向后兼容)。一堆这样的代码是用 memalign 进行内存优化的,我对此非常缺乏经验,所以我的问题是如何更新这段代码(或者只是保持原样),以及是否还有任何意义将它放在那里:
声明:
float *table_pf;
Run Code Online (Sandbox Code Playgroud)
以及它是如何在构造函数中初始化的:
table_pf = (float*)memalign(32, sizeof(float) * TALBLE_SIZE);
Run Code Online (Sandbox Code Playgroud)
我无法找到现代 C++ 的任何等效项,但我也可能错过了它。通常我会简单地将指针转换为 std::vector 或 std::array,但这在使用 memalign 时不起作用。
如果std::array您可以选择,则很容易对齐(这同样适用于裸数组):
alignas(32) std::array<TALBLE_SIZE, float> table;
Run Code Online (Sandbox Code Playgroud)
从 C 继承的动态分配过度对齐内存的标准函数是std::aligned_alloc。它与非标准几乎相同memalign;唯一的区别是它更严格地要求大小是对齐的倍数。纯 C++ 选项是将运算符 new 与std::align_val_t操作数一起使用,默认情况下将使用std::aligned_alloc。
不过,使用分配函数返回的裸指针并不是一个好主意:您应该使用 RAII。std::vector一种选择是与使用过度对齐分配函数的分配器一起使用。标准库不提供这样的分配器,因此需要使用自定义分配器。std::unique_ptr一个更直接但不太灵活的选项是与调用的删除器一起使用std::free(或者如果您使用了operator new,则使用operator delete)。