编程杂谈——使用emplace_back取代push_back
近日在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方法必须要使用,可以减少分配内存时间,提升性能
作者:Ken.W
出处:http://www.cnblogs.com/kenwoo
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/kenwoo
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
分类:
Technology
标签:
C++
, Programming
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具