std::vector::push_back和std::vector::emplace_back的区别
顶
原
荐
字数 583
阅读 2
收藏 0
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差异这么大
© 著作权归作者所有
共有人打赏支持
上一篇: C++11对象池和内存池
下一篇: C++11对象池
相关文章 最新文章
C++11中,针对顺序容器(如vector、deque、list),新标准引入了三个新成员:emplacefront、emplace和emplaceback,这些操作构造而不是拷贝元素。这些操作分别对应pushfront、insert和pushbac...
fengbingchun
2017/11/29
0
0
(1)提前分配足够的空间以避免不必要的重新分配和复制周期 这个情况在 Scott Meyers 的书中得到了很好的解释,这本书叫 Effective STL-50条有效使用STL的经验: 对于 vector 和 string,在需...
吃一堑消化不良
2016/12/01
29
0
一、概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存...
乐搏学院
2016/12/08
2
0
我对 c++ 容器的使用印象就是容器中最好存对象的指针,不要直接存放对象。看下面的代码片段,最好用 vec1 ,而 vec2 在添加对象到容器中时,会多一次复制。 所以我潜意识就是存放指针,不要直...
iiRecord
2016/11/19
44
0
看别人用Qt写的程序时,偶然发现虽然程序中用到了foreach。foreach本来不是C++的关键字,但Qt是如何实现的呢?查看Qt的文档,里面说是用preprocesser(预处理)实现的。研究了一下,原来是宏定...
日久不生情
2017/11/14
0
0
没有更多内容
加载失败,请刷新页面
加载更多生活在资讯爆炸的时代是一件痛并快乐着的事情,我们会不断发现一些受益匪浅、酣畅淋漓的文字,同时也会遇到更多东拼西凑、胡说八道的垃圾。那么,热爱阅读的我们,应该怎么办? 这里,给大家...
Fundebug
32分钟前
7
0
导读:Map竟然不属于 Java 集合框架的子集?队列也和List一样属于集合的三大子集之一?更有队列的正确使用姿势,一起来看吧! Java中的集合通常指的是Collection下的三个集合框架List、Set、Q...
王磊的博客
35分钟前
4
0
//设置表自增初始值 alter table users AUTO_INCREMENT=10000; //mysql通过关联字段同步两张表的字段内容 update table_name1 a set a.content = (select b.content from table_name2 b wher......
koothon
38分钟前
3
0
概述 我们都知道一个进程是与其他进程共享CPU和内存资源的。正因如此,操作系统需要有一套完善的内存管理机制才能防止进程之间内存泄漏的问题。 为了更加有效地管理内存并减少出错,现代操作...
黑客画家
39分钟前
3
0
server端改造 1、添加依赖 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><......
itcloud
41分钟前
2
0
没有更多内容
加载失败,请刷新页面
加载更多以上所述就是小编给大家介绍的《std::vector::push_back和std::vector::emplace_back的区别 原 荐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。