如何使memalign在c++代码库中现代化?



我正在现代化/更新一些原来用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操作数使用操作符new,默认情况下使用std::aligned_alloc

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

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

相关内容

  • 没有找到相关文章

最新更新