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

程序转化语意学

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 候捷 译
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页