编译器优化

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

所有的return指令传回相同的具名数值(xx),因此编译器可能自己做优化,方法是以result参数取代named return value(NRV)。编译器把其中的xx以_result取代:

void bar(X& _result) 
{
    // default constructor 被调用 C++伪码
    _result.X::X();
    // ......直接处理_result
    return;
}

你准备你的copy constructor,使你的程序“以copying方式产生出一个object时”,对称的调用destructor,例如:

void foo()
{
    // 这里希望有一个copy constructor
    X xx = bar();
    // ...
    // 这里调用destructor
}

这种情况下,对称性被优化打破了。

X x0(1024);
X x1 = X(1024);
X x2 = (X)1024;

第二行和第三行中,语法明显提供了两个步骤的初始化操作

  1. 将一个临时性的object设以初值1024;
  2. 将临时性的object以拷贝构造的方式作为explicit object的初值。

而x1是被单一的constructor操作设定初值:x0.X::X(1024)
x1和x2却调用两个constructor,产生一个临时性object,并针对该临时性object调用class X的destructor:

// C++伪码
X _temp0;
_temp0.X::X(1024);
x1.X::X(_temp0);
_temp.X::~X();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值