对于基本类型来说值得
Is emplace for basic types worth it?
假设我有一个map<int, int>
:
std::map<int, int> map;
map.emplace(1, 2);
map.insert({3, 4});
两个调用之间会有什么区别吗?
在第一次调用中,两个整数将按值复制到 emplace
函数,然后再次复制到 std::pair<int, int>
构造函数。在第二次调用中,两个整数将按值复制到std::pair<int, int>
构造函数,然后作为第一对的成员再次按值复制到内部std::pair<int, int>
。
我理解 emplace 对于像 std::string
这样的类型的好处,它们将在第二次调用中按值复制并在第一次调用中一直移动,但是在所述情况下使用emplace
有什么好处吗?
如果 emplace 有可能失败(键已经存在),Emplace 会变慢。
这是因为需要emplace
分配节点并在其中构造pair<Key const, Value>
,然后从该节点中提取密钥并检查密钥是否已存在,如果密钥已存在,则取消分配节点。另一方面,insert
可以从要插入的传递值中提取键,因此如果插入失败,则不需要分配节点。请参阅:emplace的性能比检查差,其次是emplace。
为了解决这个问题,C++17 try_emplace(const key_type& k, Args&&... args)
(等)添加一个成员函数。
在成功的情况下,这两种情况之间没有真正的区别;操作的顺序不同,但这不会以任何可预测的方式影响性能。对于emplace
变体,代码大小仍将略大,因为它必须准备好在失败情况下执行更多工作。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 对于基本类型来说值得
- 是否值得只包含type_traits以获取枚举的基础类型