首頁 > 後端開發 > C++ > 命名回傳值最佳化 (NRVO) 如何影響局部變數回傳行為?

命名回傳值最佳化 (NRVO) 如何影響局部變數回傳行為?

Barbara Streisand
發布: 2024-11-09 09:03:02
原創
791 人瀏覽過

How Does Named Return Value Optimization (NRVO) Affect Local Variable Return Behavior?

了解局部變數的回傳行為

從函數傳回局部變數時,其行為可能會因編譯器最佳化而異。

NRVO(命名回傳值最佳化)

啟用 NRVO 時,編譯器會透過在傳回值處直接建立傳回的物件來最佳化回傳語句。在這種情況下,不會執行任何複製,返回後原始物件將被銷毀。

啟用NRVO 的輸出

// With NRVO enabled, only one constructor and destructor call is made.
class test {
public:
  test(int p) {
    std::cout << "Constructor (test(int p)) called\n";
  }

  ~test() {
    std::cout << "Destructor called\n";
  }
};

test function() {
  test i(8);
  return i;
}

int main() {
  test o = function();
  return 0;
}
登入後複製

輸出:

Constructor (test(int p)) called
Destructor called
登入後複製

要停用NRVO,請在編譯期間使用-fno-elide-constructors 標誌。在這種情況下,編譯器不會執行 NRVO,並在傳回值中建立物件的副本。

禁用NRVO 的輸出

輸出:

// With NRVO disabled, both constructor and destructor calls are made twice.
class test {
public:
  test(int p) {
    std::cout << "Constructor (test(int p)) called\n";
  }

  test(test&& other) {
    std::cout << "Constructor (test(test&& other)) called\n";
  }

  ~test() {
    std::cout << "Destructor called\n";
  }
};

test function() {
  test i(8);
  return i;
}

int main() {
  test o = function();
  return 0;
}
登入後複製

總結

Constructor (test(int p)) called
Constructor (test(test&& other)) called
Destructor called
Destructor called
登入後複製

啟用NRVO 後,返回局部變數無需副本,直接在返回站點構造對象,並立即銷毀原始對象。

停用 NRVO 後,將建立並傳回物件的副本,從而產生物件的兩個副本。

以上是命名回傳值最佳化 (NRVO) 如何影響局部變數回傳行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板