我是 C 及其底層的初學者(與 Python 等相比)。我在 StackOverflow 上讀過字串文字進入只讀資料部分(字串文字:它們去哪里?),但目前我正在閱讀一本 C 書(由 Bjarne Stroustrup 撰寫),它寫在那里臨時物件結束他們的生命在一個運算式的結尾,所以:
string var1 = "Hello ";
string var2 = "World";
string var3 = var1 var2; // string temp = "Hello World" and assign it to var3
執行后,我們會留下兩份 "Hello World"還是只剩下一份?
硬體:
OS: Windows 11;
Compiler: MSVC;
Standard: C 11
我知道它可能是實作定義的,但如果是這樣,請指定 x86 平臺。
uj5u.com熱心網友回復:
字串文字是用語法專門參考的物件
"Hello "
或者
"World"
這就是字面量的意思,一個值的原子語法。它通常不指代字串值。
字串文字不是臨時物件。它們是以未指定的方式存盤的物件(實際上,通常在只讀記憶體中,如您所指出的那樣)并且具有靜態存盤持續時間,這意味著它們在整個程式執行期間存在。
當你寫
string var1 = "Hello ";
您正在創建一個std::string物件,并且該物件是從字串文字初始化的。它本身既不是字串文字,也不包含或參考一個字串文字。它只會將文字中的字符復制到它自己管理的某個存盤中。物件(如果在var1塊范圍內宣告,即在函式內)具有自動存盤持續時間,這意味著它會一直存在到宣告它的范圍結束。
線
string var3 = var1 var2;
用于(在 C 17 之前)創建一個臨時std::string物件,該物件 由std::string. 然后var3是從這個臨時的移動構建的。臨時結果 fromvar1 var2將一直持續到完整運算式的結尾,這意味著直到初始化var3完成之后。
但是,從 C 17 開始,這里不再涉及臨時性。相反, 運算子多載將直接構造var3物件。在 C 17 之前,這也被允許作為所謂的回傳值優化發生。
因此,在您的代碼中,不存在任何"Hello World"字串文字,但只存在一個string包含 characters 的物件,Hello World如果您使用的是 C 17 之前的版本,則可能還有一個臨時std::string物件包含相同的值,但在var3.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425967.html
上一篇:用戶將在其中輸入姓名并決定顯示哪個性別(M/F)的C 程式
下一篇:從臨時物件的資料成員中正確移動
