【发布时间】:2016-06-28 13:32:26
【问题描述】:
当元素被默认插入到std::vector<T>的实例中时,它们默认值初始化。我经常使用多线程高性能代码,在这种情况下,大型数组的这种值初始化可能代表不可接受的顺序瓶颈。
如果在并发代码中,基于reserve() 和push_back()/emplace_back() 的典型方法是没有用的。我通常会选择以下选项之一:
- 为
T定义一个空的默认构造函数, - 具有空
construct()成员函数的自定义分配器的定义和使用。
但是,这两种解决方案都远非优雅,而且也有缺点。前者不能用于T为POD类型,如double。后者需要 C++ 标准库的给定实现来支持相对较新的DefaultInsertable 概念。此外,自定义分配器的定义非常繁琐。
是否有可能在 C++ 的未来有一些直接的方法来“关闭”这种默认插入/值初始化?
更新
Mayebe,我应该简单地问一下,对于算术类型,是否可以避免 零初始化 向量的默认插入元素。
【问题讨论】:
-
不。当一个类的实例被构造时,它就被构造了。除了构造一个类的新实例之外,别无选择。这涉及到语言的基本完整性。您将不得不使默认构造函数尽可能轻量级。
-
@SamVarshavchik 好的,这对于课程来说是合理的。但是,例如,对于双精度向量,我不需要将元素归零。
-
一定要用矢量吗?你总是可以只是
malloc()你需要什么。 -
可以使用
std::vector+ 自定义分配器或使用适当的 Boost 向量变体。在某个地方有一个骗子(比thisiirc 更好),但我现在没有时间搜索。 -
这样的分配器已准备好在我正在考虑的欺骗中使用,因此无需重做。如果您不想要 Boost,那可能是最简单的方法。一些重构必须在 bc 发生。正常
std::vector<T>必须值初始化 bc。标准是这样说的,没有办法。我不知道委员会正在讨论更简单的替代方案。
标签: c++ vector resize value-initialization