编程杂谈——使用emplace_back取代push_back
2024-09-01 10:06:08
近日在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方法必须要使用,可以减少分配内存时间,提升性能
最新文章
- 64位Windows2008下插入Oracle中文乱码问题解决
- &ldquo;耐撕&rdquo;团队 2016.04.08 站立会议
- C++学习笔记之输入、输出和文件
- 前端性能优化(三)——传统 JavaScript 优化的误区
- Qt Creator编译问题
- 微信小程序开发之大坑记之post请求
- Angular.js学习笔记 (一)
- Programming In Scala笔记-第九章、控制抽象
- typeScript面对对象篇二
- Vue插槽的深入理解和应用
- 在 CentOS 上编写 init.d service script [转]
- hdu3586 树形dp+二分答案
- 如何使用 window api 转换字符集?(std::string与std::wstring的相互转换)
- 20165308 2017-2018-2 《Java程序设计》第2周学习总结
- PCL点云分割(1)
- 最大生成树——LCA
- 使用UniBeast安装Hackintosh(黑苹果)
- windows svn 客户端连不上linux svn server
- c++ 重载运算与类型转换
- Linux 应用笔记