2014-01-30 98 views
1

我一直在閱讀有關RVO並通過引用與值傳遞參數。我明白了:通過引用傳遞只是用於傳遞指針的語法糖,並通過值傳遞調用類的拷貝構造函數來創建函數要使用的原始對象的副本。 RVO避免爲函數的返回值調用複製構造函數。什麼時候構造函數參數和返回值?

我在理解中缺少的是何時發生值的確實構造參數傳遞和值返回的對象。我所假設的是,在實際的調用和返回值是在返回之前拷貝構建(在沒有RVO的情況下)之前,通過值傳遞的對象在堆棧上構建。它是否正確?

回答

2

你assumtions是非常正確。對於按值傳遞時, 對象被創建在參數 正常傳遞的位置,函數被調用之前的某個時候(但在前面的發言後 ),並 從函數返回,就好像它們是本地之前銷燬變量在 的功能。對於通過引用,該對象在堆棧上(或任何通常構造臨時對象的地方)構造爲 , 並在完整表達式的末尾被破壞。對於返回值 值,該對象由被調用函數構造,返回語句中的 (但在調用局部變量的析構函數之前),並由被調用者在 完整表達式的結尾處構造。

+0

_For傳中,對象是在棧上構造(或其它地方的臨時通常做成),並在全expression._結束破壞你是什麼意思?使用_pass-by-reference_通常不會調用構造函數。 – MWid

+0

@MWid正是它所說的。大多數編譯器都會在堆棧上構建臨時對象,並附帶局部變量,但並不要求這種情況。但是,只要編譯器通常構造其臨時對象,就會構建一個臨時參考文件。 –

+0

特別是x86上的@JamesKanze,如何返回類對象?顯然,你不能適應'eax'(或'rax')。 這是一個單獨的問題的材料? – chbaker0

1

簡短的回答:是的

龍答:是的,更多細節見的ASM:d

其它附加信息:該參數的計算順序取決於你編譯

1

通常,你是對的。

「Return Value Elision」或「Copy Elision」有一個奇怪的概念。從本質上講,一些編譯器有足夠的智慧,看你是價值迴歸,並會盡一切到位(在某些情況下,我沒有帶發現的任何編譯器就足夠可靠,要麼RHR或返回值優化是不是超有幫助)。

本質:

std::vector<int> foo(); 
std::vector<int> bar = foo(); 

實際使用欄的位置的記憶裏作爲返回值。

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

所以它可能發生。我從未被引用信任它......

+0

「我還沒有發現任何編譯器可靠」:Visual Studios在任何時候只有一個'在函數中返回(這意味着函數寫得很好)。 –

+0

@JamesKanze是的,我可能只是偏執一點,我有文章作者的一般情緒: - /。信任編譯器爲高性能應用程序執行此操作令人討厭。我剛開始問自己,如果我以後需要添加不同的返回語句,該怎麼辦?如果我把它變成一個虛擬功能呢?如果我需要通過函數指針調用它,該怎麼辦?即使它很愚蠢,我在晚上通過參考時睡得更好。 :-P – IdeaHat

+0

...或者使用C++ 11,cuz移動構造函數非常棒,當你可以的時候獲得上面的值,或者當你不能時獲得輕量級的副本。 – IdeaHat

相關問題