簡體   English   中英

將函數的返回值存儲在參考 C++ 中

[英]Store return value of function in reference C++

將對象的返回值存儲在引用中是否有效?

class A { ... };
A myFunction()
{
    A myObject;
    return myObject;
} //myObject goes out of scope here

void mySecondFunction()
{
    A& mySecondObject = myFunction();
}

是否可以這樣做以避免將 myObject 復制到 mySecondObject? 不再需要 myObject 並且應該與 mySecondObject 完全相同,因此理論上將對象的所有權從一個對象傳遞給另一個對象會更快。 (這也可以使用 boost 共享指針,但它具有共享指針的開銷。)

提前致謝。

不允許將臨時引用綁定到非常量引用,但是如果您將引用設置為常量,則會將臨時引用的生命周期延長到引用,請參閱Danny Kalev 關於它的帖子

簡而言之:

const A& mySecondObject = myFunction();

使用 const 引用是可能的。

myFunction按值返回,因此返回值是一個臨時對象。 您可以將一個臨時對象綁定到一個 const 引用,並且臨時對象的生命周期被擴展到引用的生命周期。 您不能將臨時對象綁定到非常量引用(不幸的是)。

myFunction的返回值可能是myObject副本 從好的方面來說,復制構造函數省略(在這種情況下也稱為“命名返回值優化”)允許編譯器將myObject直接構造到臨時對象中,該臨時對象是myFunction的返回值,大概位於調用代碼堆棧的某個位置。 如果這樣做,那么當myObject超出范圍時,該對象實際上不會被銷毀。 優化通常會實現 - 例如 GCC(通常?)即使沒有任何優化標志也會這樣做。

如果您這樣做,復制構造函數省略還允許編譯器避免所有復制:

A mySecondObject = myFunction();

這需要應用兩種合法類型的復制構造函數省略:(1) 從函數返回命名值,以及 (2) 從臨時對象初始化對象。

您可能對許多編譯器為避免調用復制構造函數而進行的按值返回優化感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM