2012-04-26 52 views
1

請參閱C++中的指針嗎?請參閱C++中的指針嗎

int &x = y; 

x在內存中是否有空間?

+0

我相信這可能會回答'它有空間嗎?':http://stackoverflow.com/questions/1179937/how-does-ac-reference-look-memory-wise - 基本上,實現定義 - 他們可以(最有可能的是)用指針來實現,並且它們可能不需要在堆棧上佔用空間。 – birryree 2012-04-26 03:31:31

回答

5

依賴於實現而且未由標準指定。編譯器可以將int &x視爲一個指針,並在堆棧上爲其留出空間;它可能會掛在CPU寄存器中(因此不需要堆棧空間);它可能會意識到它是現有對象的不同名稱,只是在運行時混淆了這兩個名稱。

下面是幾種情況,作爲編譯器如何使用引用來完成不同事情的示例,具體取決於它的使用方式。

在功能,如:

int foo(int x) 
{ 
    int &y = x; 
    y += 2; 
    return y + x; 
} 

像MSVC編譯器將簡單地考慮Y設置爲X —一個別名相同的變量—,靜靜地不同的名稱替換所有提及的ýX編譯期間。因此,該功能實際上將被編譯,但就好像它是

int foo(int x) 
{ 
    x += 2; 
    return x + x; 
} 

,如果使用引用作爲參數

int foo(int &x) 
{ 
    x += 2; 
    return x; 
} 

然後X爲指針,passed into the function on the stack like any other parameter在內部實現。編譯器把它當作好像它是:

int foo(int *x) 
{ 
    (*x) += 2; 
    return *x; 
} 

的一點是,在回答你的問題取決於不只是你正在使用的編譯器,但也是特定的代碼你寫。它沒有以任何方式被標準規定。

2

引用在引擎蓋下實現爲一個指針是很常見的。安騰C++ ABI指定指針參數:

3.1.2參考參數

參考參數通過將指針傳遞到實際的參數進行處理。

是的,一個引用使用一些內存。如果它的實現實際上是一個指針,那麼它將是指針大小。如何實現引用是實現定義的。

編輯

作爲傑西好從標準的引用,參考是否需要存儲與否是不確定的。

+1

'是的,一個引用使用了一些內存.'從標準:'沒有指定引用是否需要存儲',所以這一點有點誤導。 – 2012-04-26 03:37:19

+0

@JesseGood我會添加它,雖然同樣可以說任何臨時... – justin 2012-04-26 03:43:10

+0

尤其是,C++ ABI處理函數簽名。那是因爲每個函數都是由一個編譯器編譯的,所以你只需要標準化它們之間的接口。函數內部結構留給每個編譯器,並且許多可以消除那裏的引用。 – MSalters 2012-04-26 08:27:28

1

傳遞作爲函數參數的引用可能通過傳遞指針來工作。在同一個範圍內聲明對現有變量的引用,就像在你的例子中一樣,可能只是使兩個名字都指向內存中的相同位置。但這是依賴於實現的;不同的編譯器可能會有所不同。