std::vector::push_back和std::vector::emplace_back的区别
vector<T>().push_back(T(args));
相当于
vector<T>().emplace_back(args);
C++11之前,push_back先后调用了构造函数、拷贝构造函数(临时申请堆空间,影响性能);
C++11之后,push_back先后调用了构造函数、转移构造函数。
在C++11的基础上,emplace_back比push_back少了一次转移构造函数,只有构造函数。
在www.cplusplus.com的std::vector::push_back的注解中,提到参数可能被拷贝或移动(即 左值引用 或 右值引用):
Adds a new element at the end of the vector, after its current last element. The content of val is copied (or moved) to the new element.
这里有个帖子做了性能测试,https://blog.csdn.net/yockie/article/details/52674366
大致代码如下:
std::vector<std::string> v; int count = 10000000; //分别for循环调用10000000次 v.reserve(count); //预分配十万大小,排除掉分配内存的时间 // 方式一:push_back(const string&),参数是左值引用(传统的引用) { // push_back string:327ms【最慢】 std::string temp("ceshi"); // 一次std::string构造函数 v.push_back(temp); // 左值引用,临时变量的构造函数,拷贝构造 } // 方式二:push_back(string &&), 参数是右值引用 { // push_back move(string):213ms std::string temp("ceshi"); // 一次std::string构造函数 v.push_back(std::move(temp)); // 右值引用,临时变量的构造函数,拷贝构造 // push_back(string):229 ms v.push_back(std::string("ceshi")); // 一次std::string构造函数,临时变量的构造函数,右值引用,拷贝构造 // push_back(c string):215 ms v.push_back("ceshi"); // 比上面两种稍微快一点点,少了一次std::string构造函数 } // 方式三:emplace_back(c string):122 ms【最块】 { v.emplace_back("ceshi"); // 只有一次构造函数,不调用拷贝构造函数,速度最快 }
参考资料:
[解说]:c++ 11中emplace_back替代push_back的相关知识点,含右值引用,move用法等
[测试]:C++11使用emplace_back代替push_back
[解说]:emplace_back() 和 push_back 的区别
[问题]:为何vector的push_back操作与emplace_back差异这么大
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
nmap端口检测命令总结&kali自带wafw00f工具
使用nmap目的是为了检测目标机开放的端口情况。 一、检测端口情况 第一步:检测目标机是否开启(nmap -sn * 命令) 第二步:检测目标机开放的端口,分别向1000个TCP端口发送探测包,若有回应则说明端口是开放的,也就说明对应服务是运行状态。(nmap -O * 命令) 第三步:查询正在运行的服务的版本。(nmap -sV -O * 命令) 二、nmap包含的其他工具 1、测试waf是否存在(nmap -p80,443 --script=http-waf-detect * 命令) 从图中可以看到waf是存在的,接下来还可以精确定位所使用的waf产品(nmap -p 80,443 --script=http-waf-fingerprint * 命令),但是利用这个命令我并没有测试出来什么有效的信息 2、还有一个kali linux自带的脚本wafw00f可以帮助我们检测waf版本(wafw00f * 命令) 可以看到获取了该服务器使用的防火墙是OWASP CRS。 该工具的原理:发送一些基本的恶意包,根据响应信息查找其中具有标识性的信息。
- 下一篇
月下载量千万的 npm 包被黑客篡改,Vue 开发者可能正在遭受攻击
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 【年末促销】葡萄城 2018 岁末福利火热放送中 原文转载自 公众号justjavac 早起看手机,结果发现我的微信群炸了,未读消息 999+,大家都在讨论 event-stream 事件。打开 twitter 也是被这个刷屏了。 于是翻看了一下 GitHub Issue,大概知道了事情的原委。 用户 @FallingSnow 在 GitHub 上为 event-stream 仓库创建了一个 issue,标题为:"I don't know what to say.",翻译过来大概就是“我也是很无语了”。因为 event-stream 包突然多出了一个名为 flatmap-stream 的依赖项,而这个依赖项正在窃取用户的数字货币。 event-stream 被很多的前端流行框架和库使用,每月有几千万的下载量。在 Vue 的官方脚手架 vue-cli 中也使用了这个依赖,作为最流行的前端框架之一,这个影响还是挺大的。而 React 则躲过了以此影响。 flatmap-stream 中的恶意代码会扫...
相关文章
文章评论
共有0条评论来说两句吧...