马洛克C++性能



我正在优化一个以性能为优先级的程序的计算密集型部分。

目前,我将 std::array 用于无法立即初始化的各种类型的数据和缓存。我想为缓存分配内存,而不默认初始化元素以提高性能,以便我可以在计算出元素后使用适当的值初始化它们。我能想到的唯一方法是使用 malloc。是否有任何"更清洁"的方法来实现这一点,这是否是 malloc 在C++中的合理使用?

我知道"永远不要使用 malloc/new[]"的常见建议。显然需要基于测量进行优化。这不是过早的优化。这部分代码在每个线程上每秒调用 ~250 万次,每次调用应在 1000 纳秒内运行。

分配一个字节数组,该数组足够大,以容纳最终要构造的最大数量的元素。然后,每当要构造数组中给定字节偏移量的对象时,都可以使用placement-new

您也可以使用std::aligned_storage作为数组元素类型,而不是使用原始字节。链接的文档甚至提供了这种确切技术的示例。

下面介绍如何在不初始化 C 样式 API 或低级 API的情况下干净地分配std::array,也无需求助于 C 样式的 API 或低级 APIaligned_storage

#include <memory>
#include <array>
template <class T> struct uninit : public T
{
uninit() {} // do not omit, do not make = default.
};
using myarray = std::array<int, 1337>;
using myarray_uninit = uninit<myarray>;
std::unique_ptr<myarray> allocate_myarray()
{
return std::make_unique<myarray_uninit>();
}

现场演示

这个特定的答案与在堆上分配内容的性能与不在堆上分配内容的性能无关。

最新更新