如何在 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_alloc
或 posix_memalign
来 return 一个非常规对齐。
例如,当使用 SSE 或其他 SIMD 扩展时,可能需要比默认更大的内存对齐。
我的建议是阅读代码,看看是否确实需要内存对齐,如果确实需要,要么将其丢失以进行正常分配,要么移至 std::aligned_alloc
。
在我看来,文字 32
的使用是可疑的。
我是 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_alloc
或 posix_memalign
来 return 一个非常规对齐。
例如,当使用 SSE 或其他 SIMD 扩展时,可能需要比默认更大的内存对齐。
我的建议是阅读代码,看看是否确实需要内存对齐,如果确实需要,要么将其丢失以进行正常分配,要么移至 std::aligned_alloc
。
在我看来,文字 32
的使用是可疑的。