A myfunction() { return A(); }
A a = myfunction(); // default ctor only (return value optimization)
a = myfunction(); // default ctor and operator=
爲什麼不能編譯器只寫新對象插入到現有對象?我相信一個類的所有實例都佔用相同數量的(非動態)內存,所以我不明白爲什麼這會是一個問題。
A myfunction() { return A(); }
A a = myfunction(); // default ctor only (return value optimization)
a = myfunction(); // default ctor and operator=
爲什麼不能編譯器只寫新對象插入到現有對象?我相信一個類的所有實例都佔用相同數量的(非動態)內存,所以我不明白爲什麼這會是一個問題。
RVO發生僅僅是因爲C++標準的編譯器提供了一個特殊的許可證忽略拷貝構造函數和暫時的,一旦應用了優化,這將不會發生的析構函數的副作用。
沒有這樣的特殊許可忽略賦值運算符的副作用,所以不能省略。此外,由於a
在分配給它之前是有效的,因此它必須首先被破壞,以便可以構建新的對象。不僅沒有特殊許可可以通過這個析構函數調用忽略引入的副作用,更糟糕的是銷燬必須在函數調用之前發生,並且如果函數拋出,那麼你會在哪裏?
RVO作品通過構建調用者的堆棧幀返回值。
在第一種情況中,可以直接構造在存儲爲a
,因爲沒有對象還沒有。
在第二種情況下,已經有一個對象那裏,所以它必須在其他地方建造被分配到a
之前。你不能在a
之上構建一個新對象,因爲這不是分配的工作方式。
-1:第一種情況根本不是轉讓。檢查可調用(但不會被調用)的是複製構造函數,而不是賦值運算符。 – 6502
@ 6502爲什麼-1?邁克並沒有說任何關於第一個案件的任務;如果他沒有明確地說它不是這樣,那是因爲從問題中可以清楚地看到它不是。 –
@ 6502:事實上,第一種情況不是轉讓,這就是爲什麼我沒有說出來。 –
您是否開啓了優化,您是否使用C++ 11 – aaronman
*爲什麼編譯器不能將新對象寫入現有對象?* ...並泄漏當前擁有的任何資源「a」? – Praetorian
如果構造函數,賦值運算符和析構函數是由編譯器生成的,或者在某些情況下這些並不重要,某些編譯器可能會這樣做。 – user964970