本文首发于个人博客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

History

  • 20190422: created.

Copyright

3个例子详解C++ 11 中push_back 和 emplace_back差异的更多相关文章

  1. 详解 C++11 lambda表达式

    详解 C++11 lambda表达式   lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的la ...

  2. 详解WebService开发中四个常见问题(2)

    详解WebService开发中四个常见问题(2)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  3. Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)

    Lambda表达式详解(例子详解)     lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...

  4. windows scala helloworld例子详解

    [学习笔记] windows scala helloworld例子详解: 在操作系统中,我们的Test3.scala会生成Test3.class,然后class文件被虚拟机加载并执行, 这一点和jav ...

  5. 详解WebService开发中四个常见问题(1)

    详解WebService开发中四个常见问题(1)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  6. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

  7. 第7.16节 案例详解:Python中classmethod定义的类方法

    第7.16节  案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一.    案例说明 本节定义的一个 ...

  8. 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

    详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html   实例: ...

  9. 详解 Go 语言中的 time.Duration 类型

    swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...

随机推荐

  1. Codeforces--Books Exchange (hard version)

    题目链接http://codeforces.com/contest/1249/problem/B2 .并查集思想,将数分成多个集合,每个集合的大小就是一轮的所需天数. Map[i]存储数据. flag ...

  2. java 连续数字数组分组

    问题: 1. 将Lis list = Arrays.asList(1,2,3,5,8,9,10), 拆分成 [1,2,3] .[5]. [8,9,10] , 2. 再传入一个数字 9, 将匹配数字9的 ...

  3. win7更新,360手机安装谷歌框架

    这两天把11平台被卸载了,不能打竞技场了,很伤心. 成年男子,总要找点有趣的事情去做.我准备洗心革面,好好学习.(巴拉巴拉巴拉一万字.) 首先第一件事情就是重装系统,(由于买了个假显卡,win10以上 ...

  4. linux 下ln命令--笔记

    linux 下ln命令 ln命令用来为文件创建连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项.注意:符号链接文件不是一个独立 ...

  5. day26作业

    1.整理TCP三次握手.四次挥手图 2.基于TCP开发一款远程CMD程序 客户端连接服务器后,可以向服务器发送命令 服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端 注意 ...

  6. 提高首屏页面加载速度,解决vue-cli打包后单个文件过大的问题

    本教程是针对vue-cli3以上的版本,其实原理都大同小异,这个demo为vue-cli直接创建的项目,并在main.js中引入了echart.element-ui.lodash 首先看demo打包后 ...

  7. 学习笔记55_Nhibernate

    另一种ORM框架 1.添加各种dll 2.添加配置信息,根据文档直接复制粘贴.config //一般下载Nhibernate-3.0.0.Alpha2-bin包,会有Configuration_Tem ...

  8. Vs使用EF来操作MySql(经验 )

    1.安装Vs2015,至少是2012以上版本才行 2. 安装 这个是用于连接Mysql数据库的Vs插件 2.1通过这种方式添加引用 3.配置数据库 // // // 4.添加实体 注:这里最好从数据库 ...

  9. python super原理,不是指父类

    class a(object): def __init__(self): print('in a') class b(a): def __init__(self): print('in b') sup ...

  10. 2、linu

    一.常用linux命令 昨日内容回顾 linux基本命令 ls 查看目录和文件ls -la 查看所有文件和目录详情(包括隐藏文件, -l和-a可以单独使用)mkdirrmdirtouchcatcdrm ...