作者hylkevin (Kevin)
看板C_and_CPP
标题Re: [问题] pass by reference的问题
时间Mon Mar 2 03:25:48 2009
※ 引述《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
1F:推 VictorTom:推专业....Orz 03/02 09:55
2F:推 coolbeela:超专业 感谢!! 03/02 23:33