0

我有一个函数,可以从给定的字符串中提取键值列表,其中每个键/值对由 a 表示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 是依赖于编译器的行为,有什么方法可以验证这些行为是否容易发生?

4

1 回答 1

1

如果您至少针对 C++11 进行编译,则实际上只有两种可能的结果:

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

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

于 2020-06-03T07:03:50.537 回答