我正在现代化/更新一些原来用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_alloc
或posix_memalign
来返回非规则对齐。
例如,当使用SSE或其他SIMD扩展时,可能需要比默认值更大的内存对齐。
我的建议是阅读代码,看看是否确实需要内存对齐,如果真的需要,要么失去它的正常分配,要么移动到std::aligned_alloc
。
在我看来,文字32
的使用是可疑的。