如何在 C++ 代码库中对 memalign 进行现代化改造?

How to modernize memalign in a C++ codebase?

我是 modernizing/updating 一些最初用 C 编写但现在用于 C++ 代码库的旧代码(不需要向后兼容)。一堆代码是使用 memalign 优化的内存,我对此非常缺乏经验,所以我的问题是如何更新这段代码(或者保持原样)以及是否还有任何意义:

声明:

float *table_pf;

以及它是如何在构造函数中初始化的:

table_pf = (float*)memalign(32, sizeof(float) * TALBLE_SIZE);

我找不到现代 C++ 的任何等效项,但我也可能只是错过了它。通常我会简单地将指针转换为 std::vector 或 std::array 但这在使用 memalign 时不起作用。

如果 std::array 是您的选择,则对齐很容易(同样适用于裸阵列):

alignas(32) std::array<TALBLE_SIZE, float> table;

继承自C的动态分配过度对齐内存的标准函数是std::aligned_alloc。它与非标准 memalign 几乎相同;唯一的区别是它更严格地要求尺寸是对齐的倍数。一个纯 C++ 选项是使用带有 std::align_val_t 操作数的 operator new,默认情况下将使用 std::aligned_alloc.

虽然使用分配函数返回的裸指针不是一个好主意:您应该使用 RAII。一种选择是将 std::vector 与使用过度对齐分配函数的分配器一起使用。虽然标准库不提供这样的分配器,因此需要使用自定义分配器。一个更直接但不太灵活的选项是将 std::unique_ptr 与调用 std::free 的删除器一起使用(如果您使用了 operator new,则使用 operator delete)。

代码 return 是一个 TABLE_SIZE 浮点数组,地址将对齐到 32 字节。
malloc 会使用默认对齐,这通常意味着 double 大小对齐(但可以更大,具体取决于实现)。
对于浮点数数组 - 正常分配和对齐就足够了。
您将使用 memalign 或 c++ aligned_allocposix_memalign 来 return 一个非常规对齐。
例如,当使用 SSE 或其他 SIMD 扩展时,可能需要比默认更大的内存对齐。
我的建议是阅读代码,看看是否确实需要内存对齐,如果确实需要,要么将其丢失以进行正常分配,要么移至 std::aligned_alloc
在我看来,文字 32 的使用是可疑的。