【问题标题】:Is emplace for basic types worth it?基本类型的 emplace 值得吗?
【发布时间】:2016-06-02 14:58:20
【问题描述】:

假设我有一个map<int, int>

std::map<int, int> map;

map.emplace(1, 2);
map.insert({3, 4});

这两个调用会有什么区别吗?

在第一次调用中,两个整数将按值复制到emplace 函数,然后再次复制到std::pair&lt;int, int&gt; 构造函数。在第二次调用中,这两个整数将按值复制到 std::pair&lt;int, int&gt; 构造函数,然后作为第一对的成员再次按值复制到内部 std::pair&lt;int, int&gt;

我了解 emplace 对于像 std::string 这样的类型的好处,它们将在第二次调用中按值复制并在第一次调用中一直移动,但是在所描述的情况下使用 emplace 有什么好处?

【问题讨论】:

    标签: c++ containers c++14


    【解决方案1】:

    Emplace 会更慢,如果 emplace 有可能会失败(密钥已经存在)。

    这是因为emplace需要分配一个节点并在其中构造pair&lt;Key const, Value&gt;,然后从该节点中提取密钥并检查密钥是否已经存在,如果密钥已经存在则释放节点.另一方面,insert 可以从传递的值中提取要插入的键,因此如果插入失败,则不需要分配节点。见:performance of emplace is worse than check followed by emplace

    为了解决这个问题,C++17 添加了一个成员函数try_emplace(const key_type&amp; k, Args&amp;&amp;... args) (etc.)

    在成功的情况下,这两种情况并没有真正的区别;操作顺序不同,但这不会以任何可预测的方式影响性能。 emplace 变体的代码大小仍然会稍大一些,因为它必须准备好在失败的情况下执行更多工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多