像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?

Will structure like std::list<std::pair<string, string>> be copied when returned?

本文关键字:string lt gt std 返回 复制 air list 结构      更新时间:2023-10-16

我有一个函数,它应该从给定的字符串中提取一个键值列表,其中每个键/值对都由一个std::pair表示,该函数具有如下签名:

std::list<std::pair<string, string>> extract(const string &s)

如果我的实现如下所示:

list<pair<...>> kv_pairs;
for (....) {
kv_pairs.push_back(make_pair(k, v));
}
return kv_pairs;

1(我不希望发生任何副本,我想知道RVO/NRVO是否会应用于列表中的对和持有它们的列表。

2(如果在这种情况下会发生复制,那么在不复制的情况下实现这一点的替代数据结构是什么?我可以想到一个使用unique_ptr<unorder_map<>>的解决方案,但就我而言,我只需要支持列表中对的迭代,不需要支持通过它们的键查找值,所以我想避免不必要的哈希计算在插入过程中。

3(我知道RVO/NRVO是编译器依赖行为,有什么方法可以验证这些行为是否容易发生?

  • 返回标准::p空气时会发生RVO吗?
  • 什么是复制省略和返回值优化?

如果您正在编译至少 C++11 的目标,实际上只有两种可能的结果:

  • 如果没有 RVO,返回的临时将用于移动构造返回值分配到的对象。 这基本上只是打乱一些指针,无论列表中有多少项目,都将花费完全相同的时间(可以忽略不计(。
  • 使用 RVO,可以省略移动构造。

这两种结果都非常快,并且不涉及列表结构的复制。