返回时是否将复制std :: list >这样的结构?

问题描述 投票:0回答:1

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

c++ list std-pair rvo nrvo
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.