簡體   English   中英

c++ 臨時 object 問題

[英]c++ Temporary object question

這兩個函數之間創建的臨時對象的數量是否存在差異?

string foo1() {
    return "";
} 

string foo2() {
    string s = "";
    return s;
}

這是一個家庭作業問題,所以請假設沒有編譯器優化。

不——只創建一個臨時的。 function 的堆棧上的 object 不是臨時的,它是一個左值。 字符串文字也是一個左值。 兩者都涉及完全相同的過程-返回從左值構造的字符串。

是的。 如果沒有任何優化,即 NRVO(命名為返回值優化),第二個代碼將產生 2 個臨時代碼,而第一個代碼將產生一個。

沒有不同。 在這兩種情況下,都會創建一個新字符串 object(1 - 隱式,2 - 顯式)。


兩個示例都執行以下操作: 1. 將空字符串的指針壓入堆棧(或將其寫入寄存器)。 2. 創建字符串 class 的新實例(使用指定的字符串)。 3. 將新建實例的指針寫入 EAX(結果)


抱歉,這是 C++ 問題,而我想到了 C# :)

這意味着字符串 class 的實例將被復制(不是由指針返回)。 無論如何,這兩個示例都只創建了一個字符串 class 的實例(1 - 隱式,2 - 顯式),然后該實例(臨時對象)的所有字節將作為結果推入堆棧。

答案:沒有區別,只有一個臨時的 object(前提是沒有應用編譯器優化)。

注意:在這兩種情況下,編譯器都會在堆棧中分配相同數量的字節來存儲字符串 class 的實例,並且“”(空字符串)已經加載到 memory(未分配)。 唯一的區別是第一個示例隱式創建了字符串 class 的實例。

暫無
暫無

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

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