4

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

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

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

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

有没有可能在 C++ 的未来有一些直接的方法来“关闭”这个默认插入/值初始化?

更新

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

4

1 回答 1

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;
 };

用容器式的 begin/end/front/size/ []/empty 等填充它。

让它只移动。

使用零规则(带=default)。

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

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

也许有emplace(size_t,Args&&)哪个为你做了新的安置{}

于 2016-03-13T16:11:44.293 回答