程序转化语意学

1. 显式初始化

原代码为:

X x0;
void foo_bar()
{ X x1(x0);X x2 = x0; X x3 = X(x0);}

编译器将产生拷贝构造函数,调用拷贝构造函数X::X(const X& xx):

void foo_bar()
{ X x1; X x2; X x3; x1.X::X(x0); x2.X::X(x0); x3.X::X(x0);
}

2. 参数初始化

原代码为:

X xx;
foo(xx);

被转化为:

X __temp0;
__temp0.X::X(xx);
foo(__temp0);

3. 返回值初始化

原代码为:

X bar()
{X xx; // 处理 xx ... return xx;
}

被转化为:

void bar(X& __result)
{ X xx;xx.X::X(); __result.X::X(xx); return;
}

再次优化:

void bar(X& __result)
{  __result.X::X(); //直接处理return;
}

也可以程序优化:

X bar(const T& y, const T& z)
{ return X(y, z);
}

4. 例子总结:

X xx = bar();
<=>
X xx;
bar(xx);
bar().memfunc();
<=>
X __temp0;
(bar( __temp0 ), __temp0).memfunc();
x( *pf )();//函数指针
pf = bar;
<=>
void ( *pf )( X& );
pf = bar;

5. 效率比较

X xx0(1024);
<=>
xx0.X::X(1024);

xx1 xx2 调用两次构造函数,一次是构造函数,另一次是拷贝构造函数

X xx1=X(1024);
X xx2=(X)1024;
<=>
X __temp0;
__temp0.X::X(1024);
xx1.X::X(__temp0);
__temp0.X ::~X();

【引用】
[1]: <<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译

深度探索C++ 对象模型(4)-Default Copy Constructor(3)相关推荐

  1. 深度探索C++ 对象模型(4)-Default Copy Constructor(2)

    没有Default Constructor, class Myclass{ public://... private:int a;char *str; }; 编译器执行的是"位逐次拷贝(Bi ...

  2. 深度探索C++ 对象模型(4)-Default Copy Constructor(4)

    编译器层NRV优化(Named Return Value) 原代码为: class testObj{friend testObj foo(double);public:testObj(){memset ...

  3. 深度探索C++ 对象模型(4)-Default Copy Constructor(1)

    3种地方出现: 1.明确的调用拷贝构造函数 class X { }; X tmp; X xx=tmp; 2.作为参数时,对临时变量调用拷贝构造函数 void foo(X x); { }; X xx; ...

  4. 深度探索C++ 对象模型(3)-默认构造函数Default Constructor

    1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作 2. 编译器构造Defau ...

  5. 深度探索C++ 对象模型(3)-默认构造函数Default Constructor续

    (1)带有虚函数的类 class Widget { public: virtual int flip() = 0;//..}; void flip(const Widget* widget ) { w ...

  6. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...

  7. 深度探索C++对象模型第2章 构造函数语义学

    默认构造函数 两个误区: 1 任何class如果没有定义默认构造函数,就会被合成一个出来:只有在某些情况下被合成 2 编译器合成出来的默认构造函数会明确设定class中每一个数据成员的默认值 :默认值 ...

  8. 第2章构造函数语义学读书笔记——深度探索c++对象模型

    深度探索c++对象模型 第2章 构造函数语义学 2.1 Default Constructor的构建操作 2.2 Copy Constructor的构造操作 2.3 程序转化语义学 2.4 成员的初始 ...

  9. 《深度探索C++对象模型》读书笔记第五章:构造析构拷贝语意学

    <深度探索C++对象模型>读书笔记第五章:构造析构拷贝语意学 对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constr ...

最新文章

  1. Java分析股票涨跌走势
  2. 【Workshshop No.3 | Kyligence X 青云QingCloud Workshop】零基础搭建云上大数据平台
  3. mysql 数据库还原 不齐_请教mysql数据库还原问题。
  4. 图像的灰度级数越多越好_MATLAB-数字图像处理 图像直方图归一化
  5. PAT_1007(中文)_素数对猜想
  6. joa-framework 工作流快速开发框架(jeecg官方工作流版本) 发布
  7. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表
  8. linux网络命令详解
  9. 【Es】Elasticsearch 7.x 新的集群协调层
  10. SAP License:中国集团管控存在的主要问题
  11. 11-2-进程控制块
  12. Android 通过软引用实现图片缓存,防止内存溢出
  13. C++小游戏——迷宫
  14. android alertdialog 自定义时间,Android自定义dialog可选择展示年月日时间选择栏
  15. 支付宝登录应用授权,后端拼接 authinfo返回app,app进行支付宝调用获取auth_code(com.alipay.account.auth)
  16. python线程池学习
  17. Kubeadm init报错解决
  18. 现在国内的网站用户行为数据分析工具都有哪些?-宋星
  19. 光年SEO日志分析系统2.0
  20. 汉堡造型的动态导航菜单,非常有意思

热门文章

  1. 计算机专业350分能进复试吗,初试估分350分,这在考研中算一个什么水平?
  2. redis同步效率秒_redis过期策略、内存淘汰策略、持久化方式、主从复制
  3. 什么是python中子类父类_零基础入门:python中子类继承父类的__init__方法实例
  4. 数据中心机房供电需求有哪些?存在哪些电能质量问题?
  5. Computer:路由器、交换机、猫Modem的简介、区别之详细攻略
  6. Py之uiautomator2:uiautomator2的简介、安装、使用方法之详细攻略
  7. Interview:算法岗位面试—上海某公司算法岗位(偏图像算法,互联网科技行业)技术面试考点之区块链的TPS等问题
  8. DL:深度学习框架Pytorch、 Tensorflow各种角度对比
  9. 成功解决TypeError: only integer scalar arrays can be converted to a scalar index
  10. 成功解决explicit device specific/device:GPU:0' because no supported kernel for GPU devices is available.