3个例子详解C++ 11 中push_back 和 emplace_back差异
本文首发于个人博客https://kezunlin.me/post/b83bc460/,欢迎阅读最新内容!
cpp11 push_back and emplace_back
Guide
case1
#include <iostream>
#include <vector>
class A
{
public:
A (int x_arg) : x (x_arg) { std::cout << "A (x_arg)\n"; }
A () { x = 0; std::cout << "A ()\n"; }
A (const A &rhs) noexcept { x = rhs.x; std::cout << "A (A &)\n"; }
A (A &&rhs) noexcept { x = rhs.x; std::cout << "A (A &&)\n"; }
~A() { std::cout << "~A ()\n"; }
private:
int x;
};
void test_emplace_back_1()
{
// For emplace_back constructor A (int x_arg) will be called.
// And for push_back A (int x_arg) is called first and
// move A (A &&rhs) is called afterwards
{
std::vector<A> a;
std::cout << "call emplace_back:\n";
a.emplace_back(0);
// (1) direct object creation inside vector
}
{
std::vector<A> a;
std::cout << "call push_back:\n";
a.push_back(1);
// (1) create temp object and
// (2) then move copy to vector and
// (3) free temp object
}
}
/*
call emplace_back:
A (x_arg)
~A ()
call push_back:
A (x_arg)
A (A &&)
~A ()
~A ()
*/
see
image from c-difference-between-emplace_back-and-push_back-function
case2
void test_emplace_back_2()
{
// emplace_back and push_back for `A(0)`, it's same.
// A (int x_arg) is called first and
// move A (A &&rhs) is called afterwards
{
std::vector<A> a;
std::cout << "call emplace_back:\n";
a.emplace_back(A(0));
// (1) create temp object and
// (2) then move copy to vector and
// (3) free temp object
}
{
std::vector<A> a;
std::cout << "call push_back:\n";
a.push_back(A(1));
// (1) create temp object and
// (2) then move copy to vector and
// (3) free temp object
}
}
/*
call emplace_back:
A (x_arg)
A (A &&)
~A ()
~A ()
call push_back:
A (x_arg)
A (A &&)
~A ()
~A ()
*/
case 3
void test_emplace_back_3()
{
// emplace_back and push_back for `A obj(0)`, it's same.
// A (int x_arg) is called first and
// copy constructor A (A &) is called afterwards
{
std::vector<A> a;
std::cout << "call emplace_back:\n";
A obj(0);
a.emplace_back(obj);
// copy constructor to vector
}
{
std::vector<A> a;
std::cout << "call push_back:\n";
A obj(1);
a.push_back(obj);
// copy constructor to vector
}
}
/*
call emplace_back:
A (x_arg)
A (A &)
~A ()
~A ()
call push_back:
A (x_arg)
A (A &)
~A ()
~A ()
*/
Reference
- push-back-vs-emplace-back
- c-difference-between-emplace_back-and-push_back-function
- push_back and emplace_back
History
- 20190422: created.
Copyright
- Post author: kezunlin
- Post link: https://kezunlin.me/post/b83bc460/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.
3个例子详解C++ 11 中push_back 和 emplace_back差异的更多相关文章
- 详解 C++11 lambda表达式
详解 C++11 lambda表达式 lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的la ...
- 详解WebService开发中四个常见问题(2)
详解WebService开发中四个常见问题(2) WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...
- Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)
Lambda表达式详解(例子详解) lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...
- windows scala helloworld例子详解
[学习笔记] windows scala helloworld例子详解: 在操作系统中,我们的Test3.scala会生成Test3.class,然后class文件被虚拟机加载并执行, 这一点和jav ...
- 详解WebService开发中四个常见问题(1)
详解WebService开发中四个常见问题(1) WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...
- 详解Python编程中基本的数学计算使用
详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...
- 第7.16节 案例详解:Python中classmethod定义的类方法
第7.16节 案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一. 案例说明 本节定义的一个 ...
- 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html 实例: ...
- 详解 Go 语言中的 time.Duration 类型
swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...
随机推荐
- 百万年薪python之路 -- 基本数据类型
整数 -- 数字(int) 用于比较和运算 32位 2 ** 31 ~ 2 ** 31-1 64位 -2 ** 63 ~ 2 ** 63- 1 + - * / // ** % python2 整型 ...
- 10个让你受益匪浅的css使用技巧
1. Safari 3D变换会忽略z-index的层级 在Safari浏览器下(此Safari浏览器包括iOS的Safari,iPhone上的微信浏览器,以及Mac OS X系统的Safari浏览器) ...
- electron调用c#动态库
electron调用c#动态库 新建C#动态库 方法要以异步任务的方式,可以直接包装,也可以写成天然异步 代码如下 public class Class1 { public async Task< ...
- Charles抓包工具的使用(一)
前提:charles的说明 Charles其实是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在W ...
- fenby C语言P24
#include <stdio.h> int main(){ char cArr[]={'I','L','O','V','E','C'}; char sArr[]="ilovec ...
- Apache Solr Velocity模板注入RCE漏洞复现
Apache Solr Velocity模板注入RCE漏洞复现 一.Apache Solr介绍 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于web-service的API接口,用户可以通 ...
- ios Autolayout 按比例相对布局
看到一篇讲ios storyboard 按比例相对布局的博客,挺不错的转下来了! 可到liumh.com查看. 本文记录如何在 UIStoryboard 或者 xib 中进行百分比布局,包括 View ...
- 深入理解.NET Core的基元(二) - 共享框架
原文:Deep-dive into .NET Core primitives, part 2: the shared framework 作者:Nate McMaster 译文:深入理解.NET Co ...
- Dijkstra算法 笔记与思路整理
该文章可能存在硬伤与不妥,不能作为教程阅读.(因为我真的鶸 Dij作为单源最短路算法,需要先确定一个起点.Dij的函数主体为维护每个节点的dis和vis两个变量.dis表示该点距离起点的最短路权值和, ...
- [考试反思]0901NOIP模拟测试34:游离
又是放假回来的收心考.幸而熬了夜回来也不至于很困(虽说第二天早上困成狗...) 说分数吧: skyhAK300,后面有220,220,220,190,190,180 我170,排第8.凑合,其实不太满 ...