博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
emplace_back减少内存拷贝和移动
阅读量:6980 次
发布时间:2019-06-27

本文共 1746 字,大约阅读时间需要 5 分钟。

--------《深入应用C++11:代码优化与工程级应用》第2章使用C++11改进程序性能,本章将分别介绍右值引用相关的新特性。本节为大家介绍emplace_back减少内存拷贝和移动。---------

2.4 emplace_back减少内存拷贝和移动

emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。在大多数情况下应该优先使用emplace_back来代替push_back。所有的标准库容器(array除外,因为它的长度不可改变,不能插入元素)都增加了类似的方法:emplace、emplace_hint、emplace_front、emplace_after和 emplace_back,关于它们的具体用法可以参考cppreference.com。这里仅列举典型的示例。

vector的emplace_back的基本用法如下:

 

可以看出,emplace_back的用法比较简单,直接通过构造函数的参数就可以构造对象,因此,也要求对象有对应的构造函数,如果没有对应的构造函数,编译器会报错。如果把上面的构造函数注释掉,在vs2013下编译会报如下错误:

 error C2661: “A::A”: 没有重载函数接受 2 个参数 

其他容器相应的emplace方法也是类似的。

相对push_back而言,emplace_back更具性能优势。下面通过一个例子来看emplace_back和push_back的性能差异,如代码清单2-5所示。

代码清单2-5 emplace_back和push_back的比较

#include 
#include
#include
#include
using namespace std; struct Complicated { int year; double country; std::string name; Complicated(int a, double b, string c):year(a),country(b),name(c) { cout<<"is constucted"<
m; int anInt = 4; double aDouble = 5.0; std::string aString = "C++"; cout<<"—insert--"<
v; v.emplace_back(anInt, aDouble, aString); cout<<"--push_back--"<

输出如下:

 

代码清单2-5测试了map的emplace和vector的emplace_back,用map的insert方法插入元素时有两次内存移动,而用emplace时只有一次内存移动;用vector的push_back插入元素时有两次移动内存,而用emplace_back时没有内存移动,是直接构造的。

可以看到,emplace/emplace_back的性能比之前的insert和push_back的性能要提高很多,我们应该尽量用emplace/emplace_back来代替原来的插入元素的接口以提高性能。需要注意的是,我们还不能完全用emplace_back来取代push_back等老接口,因为在某些场景下并不能直接使用emplace来进行就地构造,比如,当结构体中没有提供相应的构造函数时就不能用emplace了,这时就只能用push_back。

 

另外可参考:

转载于:https://www.cnblogs.com/carsonzhu/p/5113213.html

你可能感兴趣的文章
javascript实现10进制转为N进制数
查看>>
什么时候使用CountDownLatch
查看>>
node.js里使用typescript的方法
查看>>
Maven学习(一):坐标、依赖管理和仓库
查看>>
前端方案解决思路
查看>>
redis操作数据-sorted set
查看>>
webpack工程创建
查看>>
JFinal在非web情况下启动的关于插件的设置
查看>>
linux 环境变量设置
查看>>
DS NXP11U14板子可以用了
查看>>
crond dead but subsys locked
查看>>
Jquery Select2 使用纪要
查看>>
python 网络编程之socket udp
查看>>
JPA关系映射系列二:one-to-one主键关联
查看>>
非对称加密过程详解(基于RSA非对称加密算法实现)
查看>>
递归增量监控目录/文件,逐行读取内容并输出
查看>>
CHAR和VARCHAR
查看>>
GIT分支创建和合并
查看>>
FreeBSD9.0 安装php-fpm
查看>>
MapXtreme 2005 学习心得 相关代码知识(三)
查看>>