引用被定義爲別名。該標準沒有指定它們是如何表示的,儘管實現並沒有太大的變化。基本上:
- 在一般情況下,參考是,在引擎蓋下,該對象的地址(例如指針)
- 只要有可能,則編譯器將努力消除間接
讓我們來看看它是如何轉換,從你的程序:
int main()
{
int *pi = new int(50);
int &ri = *pi;
ri = 30;
std::cout << "val = " << ri << " , " << *pi << std::endl;
}
我們可以消除ri
,因爲對象勢必是由編譯器知道:
int main()
{
int *pi = new int(50);
*pi = 30;
std::cout << "val = " << *pi << " , " << *pi << std::endl;
}
我們可以消除*pi
,因爲它的終值是由編譯器知道:
int main() {
new int(50); // stupid possible side effect usually forbid to optimize this out
std::cout << "val = " << 30 << " , " << 30 << std::endl;
}
我要指出的是,在你的例如,new
調用是完全沒用的,你也可以參考,但沒有動態分配的對象。
int main() {
int i = 50;
int& ri = i;
ri = 30;
std::cout << "val = " << ri << " < " << i << std::endl;
}
同樣有效,沒有內存泄漏。
回到我們區分表述的:
void swap(Foo& left, Foo& right);
如通常實現的:
void swap(Foo* left, Foo* right);
在這種情況下,參考最終採取(部分)的空間(如很像指針)。
在另一方面有:
class Object {
public:
Object(): foo(f), f() {}
Foo const& foo;
void set(Foo const& value);
private:
Foo f;
};
編譯器通常會不給foo
運行時表示。事實上,它是一個const
參考將用於限制上調用f
那些不改變它(語義差別)的可能的方法,但在運行時,他們將直接被傳遞f
。
沒有提及不消耗任何存儲器和變量或引用所做的任何更改都將反映到對方,這就是你需要know.Everything否則編譯器會照顧的唯一的事情,你不需要擔心。 – 2012-01-13 06:31:52
你最好只考慮引用是指針的稍微不同的語法。 C++的引用的規範是這樣的,雖然技術上沒有指針,這將是極不可能的編譯器可以把它們當作什麼,但三分球,仍然是有效的。 _NULL處理略有不同,但同樣,只有邏輯,編譯器是不可能做任何事情different_ – 2012-01-13 10:18:59