优雅地避免了未来C++向量元素的值初始化

Elegant avoiding of value-initialization of vector elements in future C++?

本文关键字:元素 向量 初始化 C++ 未来      更新时间:2023-10-16

当元素默认插入std::vector<T>的实例中时,默认情况下它们是值初始化的。我经常使用多线程高性能代码,其中这种值初始化对于大型数组可能表示不可接受的顺序瓶颈。

如果在并发代码中,基于 reserve()push_back()/emplace_back() 的典型方法是没有用的。我通常会得到以下选项之一:

  1. 定义一个空的默认构造函数 T
  2. 具有空construct()成员函数的自定义分配器的定义和使用。

然而,这两种解决方案都远非优雅,也有缺点。前者不能用于T POD 类型,例如 double 。后者需要给定的C++标准库实现,以支持相对较新的DefaultInsertable概念。此外,自定义分配器的定义非常繁琐。

C++的未来,是否有可能有一些直接的方法可以"关闭"这种默认插入/值初始化?

更新

也许,我应该简单地问一下是否有可能避免算术类型向量的默认插入元素的零初始化

矢量不适合您的需求。 它支持调整大小和意外复制,这在多线程环境中都没有意义。

编写一个简单的容器:

 template<class T,class Storage=std::aligned_storage_t<sizeof(T),alignof(T)>{
 struct buffer{
   static_assert(std::is_pod<T)::value, "pod only");
   std::size_t count;
   std::unique_ptr<Storage[]> storage;
 };

用容器式的开始/结束/正面/大小/[]/空等填充它。

让它只移动。

使用零规则(带 =default )。

给它一个explicit buffer(std::size_t) ctor,以创建未初始化的内容。

混合一些跨度/array_view类型,这应该适合您的需求。

也许有emplace(size_t,Args&&),它为您提供了新的安置{}.