优雅地避免了未来C++向量元素的值初始化
Elegant avoiding of value-initialization of vector elements in future C++?
当元素默认插入到std::vector<T>
的实例中时,默认情况下它们是值初始化的。我经常使用多线程高性能代码,其中这种值初始化对于大型数组可能表示不可接受的顺序瓶颈。
如果在并发代码中,基于 reserve()
和 push_back()
/emplace_back()
的典型方法是没有用的。我通常会得到以下选项之一:
- 定义一个空的默认构造函数
T
, - 具有空
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&&)
,它为您提供了新的安置{}
.
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- C++:如何循环通过向量中的整数元素
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 不允许在向量中添加更多元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用并行参数向量调用元素向量的成员函数
- C++ 查找字符串中存在的元素向量
- 包含 std::threads 的元素向量
- 避免从单一元素向量转换为基元类型
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 如何为对元素(向量和int)配对创建unique_ptr也是unique_ptr
- 元素向量乘法 C++(代码不起作用)
- 时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
- 遍历结构元素向量
- 犰狳C++中的元素向量或矩阵乘法
- 为什么'std::vector<int> b{2};'创建 1 元素向量,而不是 2 元素向量?
- 可移动元素向量的大小调整是否有效?
- 唯一元素向量的c++模板函数
- 获取索引和元素-向量问题
- 定义一个生成元素向量的函数时,正确的方法是什么?