2010-12-01 37 views
1

我知道什麼時候引用是一個函數的參數,並且該函數是內聯的,那麼引用可能就是引用本身,而不一定是它的指針,但是當引用不是一個參數但是是函數的局部或全局的,或是一個函數的輸出,其被內聯:在這些情況下如何處理引用?

//global scope 

void someFunc(SomeType & ref){//when function is inline, it's possible for ref to be the referent itself 
//function body 
} 
int num=7; 
int & ref=num;//what about ref here? 
void someFunc1(){ 
int num=6; 
int & ref=num;//what about ref here? 
//rest of function body 
} 
int & someFunc2(){//what about output reference here when function is inlined, will it be num itself or a pointer ? 
int num=8; 
return num; 
} 

回答

1

DavidRodríguez - dribeas在一篇評論中指出,該標準給編譯器提供了相當多的緯度,當涉及到引用時。他們可能會也可能不會佔用空間;它們本身並不是適當的對象等。

您爲引用類型的函數參數(在內聯過程中被刪除)描述的行爲對於編譯器涉及到引用時的自由是很典型的。但這是一種自由,不是他們的義務。以下情況可能並不總是可能的:當您撥打SomeFunc(a>5 ? foo : bar);時,編譯器無法將引用替換爲「該」引用本身。

您的其他示例同樣不受限制。從理論上講,全球和地方的參考資料可以被優化,因爲沒有任何東西可以阻止它。最後一個示例可以完全內聯爲exit(NasalDemons());,因爲您要返回對超出範圍的對象的引用。

1

在第一情況下,當參考是全球它將全局NUM指向源文件的末尾。第二種情況下,當參考號是someFunc1時,它會將num指向someFunc1的末尾。你不應該這樣做,因爲num將在someFunc2的末尾被銷燬,所以如果你在外面使用它,你將會出現分段錯誤。

+0

這個問題到底是「指向」的意思。 – Pooria 2010-12-01 09:56:25

1

然後引用將是指涉 本身不一定是指針 它

語義上,一個參考是總是(對於名稱)對象本身,和從未一個指向它的指針。

在實現方面,不保證如果函數被內聯,則不會使用指針。無論是全球變量還是局部變量都無法保證。您的someFunc2()創建一個懸掛參考,具有未定義的行爲。

在所有三種有效的情況下(內聯,全局,本地),編譯器很可能會避免使用額外的空間來存儲指針,但是如果你想做出明確的語句,那麼你需要選擇一個編譯器並檢查它的內部。如果是全局外部鏈接,顯然可執行格式也必須允許。

相關問題