2013-11-27 22 views
1

實施例:爲什麼分配運算符不會出現RVO? (C++)

A myfunction() { return A(); } 
A a = myfunction(); // default ctor only (return value optimization) 
a = myfunction(); // default ctor and operator= 

爲什麼不能編譯器只寫新對象插入到現有對象?我相信一個類的所有實例都佔用相同數量的(非動態)內存,所以我不明白爲什麼這會是一個問題。

+0

您是否開啓了優化,您是否使用C++ 11 – aaronman

+4

*爲什麼編譯器不能將新對象寫入現有對象?* ...並泄漏當前擁有的任何資源「a」? – Praetorian

+0

如果構造函數,賦值運算符和析構函數是由編譯器生成的,或者在某些情況下這些並不重要,某些編譯器可能會這樣做。 – user964970

回答

5

RVO發生僅僅是因爲C++標準的編譯器提供了一個特殊的許可證忽略拷貝構造函數和暫時的,一旦應用了優化,這將不會發生的析構函數的副作用。

沒有這樣的特殊許可忽略賦值運算符的副作用,所以不能省略。此外,由於a在分配給它之前是有效的,因此它必須首先被破壞,以便可以構建新的對象。不僅沒有特殊許可可以通過這個析構函數調用忽略引入的副作用,更糟糕的是銷燬必須在函數調用之前發生,並且如果函數拋出,那麼你會在哪裏?

4

RVO作品通過構建調用者的堆棧幀返回值。

在第一種情況中,可以直接構造在存儲爲a,因爲沒有對象還沒有。

在第二種情況下,已經有一個對象那裏,所以它必須在其他地方建造被分配到a之前。你不能在a之上構建一個新對象,因爲這不是分配的工作方式。

+0

-1:第一種情況根本不是轉讓。檢查可調用(但不會被調用)的是複製構造函數,而不是賦值運算符。 – 6502

+0

@ 6502爲什麼-1?邁克並沒有說任何關於第一個案件的任務;如果他沒有明確地說它不是這樣,那是因爲從問題中可以清楚地看到它不是。 –

+3

@ 6502:事實上,第一種情況不是轉讓,這就是爲什麼我沒有說出來。 –

相關問題