编译器优化

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();

你可能感兴趣的:(Inside,the,C++,object,model)