我是C++的新手。請考慮下面的代碼:在C++中創建沒有RVO的對象和副本ctors
class foo
{
int f;
public:
foo(int f1=0) : f(f1) {
cout<<"In conversion ctor\n";
}
foo(const foo & rhs) : f(rhs.f)
{
cout<<" In copy ctor\n";
}
foo& operator=(const foo & that)
{
f=that.f;
cout<<"In = optor\n";
return *this;
}
};
foo rbv()
{
foo obj(9);
return obj; //named return by value [def. 1]
}
foo caller()
{
return rbv(); // return by value [def. 2]
}
int main(void)
{
foo box=caller();
return 0;
}
- 是RBV和NRBV正確的定義如 評論指出?
- 雖然在RVO期間沒有調用 ,但它是否需要定義可訪問的副本?
沒有視網膜靜脈阻塞,在代碼塊
foo rbv() { foo obj(9); return obj; } foo ret= rbv();
是在創造 'RET'
(1)臨時(比如obj_temp)創建使用拷貝構造函數的正確執行以下步驟從obj, 堆棧對象'obj'被銷燬,
(2)ret是從obj_temp構造的複製,obj_temp後來銷燬;這意味着有三個對象'obj','obj_temp'和'ret'以及兩個拷貝參與者。
你運行它時看到了什麼文字?它確認你的猜測嗎? – dlev 2011-05-16 20:09:49
如果您不熟悉C++,那麼您應該關注的東西比RVO更多。大多數(可能90%以上)的課程都不應該是可複製的。 – 2011-05-16 20:18:22
def。 1是NRVO,def。 2是RVO,Q中缺少'O'和一些錯別字。 @dlev沒有優化,只考慮NRVO和調用rbv()而不是調用者(),1個轉換器,調用2個副本。這證實了我的猜測。只有優化轉換ctor被調用。 – Burt 2011-05-16 23:03:39