繁体   English   中英

向量 <string> 或矢量 <shared_ptr<string> &gt;在c ++中14

[英]vector<string> or vector<shared_ptr<string>> in c++ 14

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

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

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

在以下几种情况下,使用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<string>>的唯一方法。 但在这种情况下,我的建议是在集合之间共享不可变对象,即使用std::vector<shared_ptr<const string>>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM