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

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

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

最佳答案

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

当您将元素添加到 vector 时,例如调用push_back()。

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

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

  • 在不同 vector 之间共享字符串

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

    关于c++ - C++ 14中的vector <string>或vector <shared_ptr <string >>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44380726/

    10-13 08:01
    查看更多