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

时间:2016-03-13 15:04:41

标签: c++ vector resize value-initialization

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

基于reserve()push_back() / emplace_back()的典型方法在并发代码中无用。我通常最终会选择以下选项之一:

  1. 定义T的空默认构造函数,
  2. 定义和使用具有空construct()成员函数的自定义分配器。
  3. 然而,这两种解决方案都不是很优雅,也有缺点。前者不能用于T作为POD类型,例如double。后者需要给定C ++标准库的实现来支持相对较新的DefaultInsertable概念。而且,自定义分配器的定义非常繁琐。

    在C ++的未来,是否有可能会有一些直接的方式如何关闭&#34;这个默认插入/值初始化?

    更新

    Mayebe,我应该简单地询问是否可以避免算术类型向量的默认插入元素的零初始化

1 个答案:

答案 0 :(得分:3)

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

写一个简单的容器:

 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,创建未初始化的内容。

混合使用某些span / array_view类型,这应该适合您的需要。

也许让emplace(size_t,Args&&)使用{}为您添加新内容。