vector <string>或vector <shared_ptr <string>&gt;在c ++ 14

时间:2017-06-06 03:02:31

标签: c++ c++11

在旧的c ++风格中,我总是使用vector < shared_ptr < string> >vector < string* >来避免在构建包含许多vector个对象的大string时进行内存复制。

从c ++ 11开始,c ++具有rvaluemove语义;我现在可以使用vector < string >吗?

我正在使用gcc 7.1.0和clang 3.6和c ++ 14选项。

1 个答案:

答案 0 :(得分:3)

在以下几种情况下,使用vector<shared_ptr<string>>vector<string*>有助于在C ++ 11之前优化性能:

向向量添加元素时,例如调用push_back()。

  • 旧行为:如果矢量容量不够大,则内部 内存缓冲区将被重新分配,所有旧对象都将被重新分配 复制到新缓冲区。
  • C ++ 11行为:如果向量元素类型具有非投掷移动构造函数,则调用它而不是复制构造函数。 std::string有非投掷移动构造函数,因此std::vector<string>的push_back()应该不会慢于std::vector<std::shared_ptr<string>>

从函数

返回作为局部变量的向量时
  • 旧行为:如果从函数或方法返回局部变量,则复制​​结果。在一些有限的情况下,允许编译器执行返回值优化 - 直接在调用者的堆栈上分配对象。
  • C ++ 11行为:如果返回值为rvalue,则调用向量的移动构造函数。这个操作实际上非常便宜(只需交换两个指针)。因此对于int来说,使用std::vector<string>这种情况也是合适的。

在不同的载体之间共享字符串

如果您的目的是返回集合的副本而不是复制元素 - 这是std::vector<shared_ptr<string>>仍可以提供帮助的唯一方法。但在这种情况下,我的建议是在集合之间共享不可变对象,即使用std::vector<shared_ptr<const string>>