2015-10-03 34 views
0

這顯然是不好:C++返回後是否爲「無效」引用?

int& GetInvalidIntPtr(){ 
    int i; 
    return i; 
} 

這是我的例子:

FVector& GetDirectionFromCamera(){ 
    return GetActorLocation() - GetCameraComponent()->GetComponentLocation(); 
} 

的FVector基本上有3個浮動,這就是爲什麼我想返回引用,而不是一個副本。但是,我相信的計算結果是存儲在堆棧上的吧?
或者是分配在堆上的結果,因爲我立即返回它?

+1

在第二個例子中,它取決於函數和運算符的簽名和行爲。所以,如果他們返回對在堆上創建的對象的引用,那麼你就可以。如果不是,你不行。 –

+2

不知道'operator-'返回什麼是不可能的,但正確的答案很簡單:返回一個副本,停止嘗試優化複製三個浮點數的微小成本。 [保持簡單,愚蠢](https://en.wikipedia.org/wiki/KISS_principle)。 –

回答

1

的FVector基本上有3個浮動,這就是爲什麼我想返回 的ADRESS,而不是一個副本。

如果你想返回一個地址,那麼你爲什麼要返回一個參考?引用不是指針。

(刪除,因爲這個問題已經被修改爲使用「參考」而不是「地址」字。)


但是,我相信,計算的結果存儲在堆棧,對吧?

這真的取決於你的operator-究竟返回什麼。您不會向我們顯示,所以我們無法確定,但如果操作員僅僅返回FVector(因爲它應該),那麼您的代碼無法編譯,因爲臨時FVector不能用於初始化FVector&

通常,您的代碼是基於錯誤的觀念,它返回FVector的副本不知何故。不是這樣。將函數簽名更改爲FVector GetDirectionFromCamera(),並讓編譯器刪除多餘的副本。

或者是分配在堆上的結果,因爲我立即返回它?

不可以。只有當您使用動態分配時,您稱之爲「堆」纔會發揮作用。

+0

我在我的問題中將地址更改爲參考。感謝您的信息。 –

2

或者是分配在堆上的結果,因爲我立即返回它?

什麼?這將如何發生?編譯器不僅僅是在堆上奇蹟般地分配內容,因爲你返回的內容超出了範圍。

試圖優化掉三個浮點數的副本,面臨未定義行爲的風險,因爲您不明白代碼真的在做什麼,這是瘋狂。如果你不知道更好,那麼只需返回一份副本。這是簡單而安全的選擇。它也可能是最快的,因爲簡單的代碼可以讓編譯器更好地優化。