[英]Does the compiler avoid a copy when returning a string that is taken as const reference?
如果編譯器在以下情況下優化掉副本,我會徘徊。 我有一個類,其唯一的資源成員是一個字符串,可能是幾KB大。 我希望有一個這個類的公共成員來訪問該字符串,我不確定我是否應該讓這個成員返回一個引用或只是通過值。 假設我選擇按值返回
class A {
public:
A();
~A();
std::string getString() { return str; }
private:
std::string str;
}
int main() {
A *a = new A;
const std::string& str = a->getString();
std::cout << str;
}
如果我將結果作為const std::string&
作為main
,編譯器是否會優化並避免復制?
這是遠程可能的,但編譯器極不可能在此用例中優化副本。
注意,如果副本被優化掉,則調用者的臨時性本質上被綁定為對象的類成員的const
引用。 而const
表示不能更改引用的值。
只有這個問題中顯示的代碼,編譯器可以向自己證明,當const
引用保留在范圍內時,沒有什么可能改變類成員的內容,因此進行此優化是安全的。
但在一個更普遍的情況下,事情會很快變得混亂。 如果有其他類方法可能會更改引用的類成員的內容,如果在const
引用的生命周期內有任何調用,其定義不可見的函數或方法; 最可能的結果是編譯器無法知道在const
引用的整個執行范圍內是否可以修改引用的類成員,因此它將被強制生成字符串的副本,以便保證其const
-ness。
編譯器可以自由地僅進行那些導致在格式良好的程序中沒有可見的觀察到的變化的優化。 如果編譯器無法證明優化導致沒有可見的,可觀察到的更改,則不會執行優化。
PS注意“修改”還包括破壞。 建議的優化將const
引用綁定到動態范圍中的對象。 如果有任何干預調用delete
-顯式或隱式地調用各種庫容器方法的一部分-編譯器還必須證明自己的delete
d對象不能用綁定的對象const
引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.