近日在YouTube视频上看到关于vector中emplace_back与push_back区别的介绍,深感自己在现代C++中还是有不少遗漏的知识点,遂写了段代码,尝试比较两者的差别。

示例代码

#include <iostream>
#include <vector>
#include <functional>
#include <chrono> class Item
{
public:
Item(std::string name, bool display = true):name(name), display(display)
{
if (display)
std::cout << "Constructor: " << name << std::endl;
} Item(const Item& item):name(item.name), display(item.display)
{
if (item.display)
std::cout << "Copy Consturctor: " << item.name << std::endl;
}
private:
std::string name;
bool display;
}; void calculate(std::vector<Item>& v, int count, std::function<void()> const& f)
{
clock_t begin_time = clock();
for (auto i = 0; i < count; i++)
{
f();
} std::cout << float(clock() - begin_time) / CLOCKS_PER_SEC << std::endl;
} int main()
{
std::vector<Item> v;
v.reserve(2); v.push_back(Item("push_back"));
v.emplace_back("emplace_back", true); v.clear(); int count = 100000;
v.reserve(count); calculate(v, count, [&]() { v.push_back(Item("push_back", false)); }); v.clear(); calculate(v, count, [&]() { v.emplace_back("emplace_back", false); });
}

运行结果

Constructor: push_back
Copy Consturctor: push_back
Constructor: emplace_back
0.431
0.28

结论

  • emplace_back方法可以不调用拷贝构造函数,所以理论上它应该比push_back性能更好
  • 经过10W次量级的数据计算,最终结果与预期一致
  • reserve方法必须要使用,可以减少分配内存时间,提升性能

最新文章

  1. 64位Windows2008下插入Oracle中文乱码问题解决
  2. &ldquo;耐撕&rdquo;团队 2016.04.08 站立会议
  3. C++学习笔记之输入、输出和文件
  4. 前端性能优化(三)——传统 JavaScript 优化的误区
  5. Qt Creator编译问题
  6. 微信小程序开发之大坑记之post请求
  7. Angular.js学习笔记 (一)
  8. Programming In Scala笔记-第九章、控制抽象
  9. typeScript面对对象篇二
  10. Vue插槽的深入理解和应用
  11. 在 CentOS 上编写 init.d service script [转]
  12. hdu3586 树形dp+二分答案
  13. 如何使用 window api 转换字符集?(std::string与std::wstring的相互转换)
  14. 20165308 2017-2018-2 《Java程序设计》第2周学习总结
  15. PCL点云分割(1)
  16. 最大生成树——LCA
  17. 使用UniBeast安装Hackintosh(黑苹果)
  18. windows svn 客户端连不上linux svn server
  19. c++ 重载运算与类型转换
  20. Linux 应用笔记

热门文章

  1. MAMP 访问时显示文件列表
  2. 弄懂goroutine调度原理
  3. Python大佬告诉你:使用Python处理yaml格式的数据简单到爆
  4. null==a和a==null的区别
  5. springboot 定时器 Schdule
  6. PLC与上位机的socket通讯——上位机C#程序(二)
  7. STL中关于全排列next_permutation以及prev_permutation的用法
  8. 02 jvm简介
  9. Day 19 磁盘管理
  10. 表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数