Program Transformation Semantics
明确的初始化
考虑这样的显式定义:
1 | X x0; |
这里的定义会分两个阶段进行:重写定义和安插copy constructor。如下:
1 | void foo_bar() |
参数的初始化
C++标准中要求的是,当把一个class object当做参数传入函数或者作为返回值时,会这样初始化:
1 | X xx = arg;//arg是实参 |
而编译器的优化技术有两种方法,一个是采用临时值,然后修改foo函数;另一个方法就是采用copy contruct的方式把实参直接构建在应该的位置上。
对于第一个方法,如下:
1 | //产生临时对象 |
返回值的初始化
考虑这样的函数定义:
1 | X bar() |
那么,这个局部对象是如何返回的呢?编译器采用的是双阶段的转化.
- 首先是添加一个引用参数,作为返回值;
- 在return之前安插copy constructor的操作,以便将要传回的object作为初始值;
修改的代码如下:
1 | void bar(X &__result)//额外参数 |
摘要
由于copy constructor的应用,编译器会对代码进行一定程度的优化。尤其是当函数以穿值的方式传回一个object时,编译器会对copy constructor进行优化,以一个额外的第一参数取代NRV。