Re: [問題] pass by reference的問題

看板C_and_CPP (C/C++)作者 (Kevin)時間16年前 (2009/03/02 03:25), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《coolbeela (今年要衝一發)》之銘言: : 小弟對這邊觀念有點不清楚...希望請大家幫我解答一下 : 以下為程式碼(compiler是dev-c++ 4.9.9.2) : #include <iostream> : #include <string> : using namespace std; : string foo(); : int main() { : string str = foo(); : cout << "address: " << &str << endl << "content: " << str << endl; : str = foo(); : cout << "address: " << &str << endl << "content: " << str << endl; : cout << "address: " << &foo()<< endl << "content: " << foo() << endl; : system("pause"); : return 0; : } : string foo() { : string s; : s = "test"; : cout << "In Foo! address: " << &s << endl << "In Foo! content: " << s << endl; : return s; : } : 以下為執行的結果 我一行一行解釋並請各位看我觀念有何問題 : In Foo! address: 0x22ff50 : In Foo! content: test : address: 0x22ff50 : content: test : 以上四行的str和foo裡面的s記憶體位置一樣 : 因為創造str時即令他等於foo() : 在這種狀況下 雖然沒有指定是return by reference : 但compiler仍會自動以reference來傳回 其實這邊是Name Return Value Optimization 也就是編譯器自動幫你把 string str = foo(); 轉成 string str; foo(str); 並且把 string foo() { string s; s = "test"; cout << "In Foo! address: " << &s << endl << "In Foo! content: " << s << endl; return s; } 轉成 void foo(string& s) { s = "test"; cout << "In Foo! address: " << &s << endl << "In Foo! content: " << s << endl; return; } 前提是foo()裡面所有的return的object都是同一個 在這邊整個過程建構子只會被呼叫一次 雖然在字面上會被呼叫兩次(string str 和 string s) 有興趣可以去查Name Return Value Optimization : In Foo! address: 0x22ff40 : In Foo! content: test : address: 0x22ff50 : content: test : 這四行 因為重新指定str = foo() 所以系統就使用return by value : 因此兩個字串變數的記憶體位置當然不一樣 : In Foo! address: 0x22ff40 : In Foo! content: test : In Foo! address: 0x22ff30 : In Foo! content: test : address: 0x22ff30 : content: test : 這一塊我就搞不清楚了 : 一開始碰到&foo()時 先呼叫了一次foo 得到s的記憶體位置是0x22ff40 <--(*) : 後來碰到foo() 再次呼叫一次 得到s的記憶體位置為0x22ff30 : 但最後在main()裡面 得到的&foo()值是0x22ff30 : 但我覺得奇怪的是 &foo()這個位置 不是應該是先被呼叫的foo()的記憶體位置嗎 : 那又由(*)的結果顯示 記憶體位置應該是0x22ff40 結果得到的卻是0x22ff30? : 我總覺得是哪裡沒搞懂 想了半天想不出來 請大家幫我看看 感謝@@ 因為他先呼叫了後面的foo()才呼叫前面的foo() 0x22ff30才是前面的s的位址 配合上前面說的NRVO 所以印出0x22ff30 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.178.123

03/02 09:55, , 1F
推專業....Orz
03/02 09:55, 1F

03/02 23:33, , 2F
超專業 感謝!!
03/02 23:33, 2F
文章代碼(AID): #19gk4_bW (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19gk4_bW (C_and_CPP)