首頁 > 後端開發 > C++ > 「想要速度?按值傳遞」總是正確的:按引用傳遞何時優於按值傳遞?

「想要速度?按值傳遞」總是正確的:按引用傳遞何時優於按值傳遞?

Barbara Streisand
發布: 2024-10-26 17:09:03
原創
817 人瀏覽過

Is

「想要速度?傳遞價值」和效能最佳化

在處理大量複製作業時,開發人員通常會努力優化效能。這個前提引出了斯科特·邁耶斯 (Scott Meyers) 創造的格言“想要速度?按價值傳遞”。然而,這個概念提出了一個問題:按值傳遞是否總是比按引用傳遞具有效能優勢?

考慮以下類別 X 和 Y:

<code class="cpp">struct X {
    std::string mem_name;

    X(std::string name) : mem_name(std::move(name)) {}
};

struct Y {
    std::string mem_name;

    Y(const std::string& name) : mem_name(name) {}
};</code>
登入後複製

在 X 中,建構子取得參數的副本並使用移動建構子來初始化其成員變數 mem_name。在 Y 中,建構子採用 const 引用並直接從參數初始化 mem_name。

現在,讓我們檢查一下使用這些類別的場景:

<code class="cpp">std::string foo() { return "a" + std::string("b"); }

int main() {
    X(foo());
    Y(foo());
}</code>
登入後複製

函數 foo() 傳回 a用於初始化 X 中的 name 和 Y 中的 mem_name 的臨時值。

對於 X,編譯器可以最佳化 foo() 的建構並將其傳回值直接放入 name 中。然後,它將 name 移到 mem_name 中。此過程導致單次移動,沒有任何副本。

相反,Y 無法執行此最佳化。它將 foo() 的臨時回傳值綁定到其引用名稱,然後將該值複製到 mem_name 中。因此,Y 執行複製。

總之,當傳遞右值(臨時物件)時,在 X 中按值傳遞有可能將過程最佳化為單一移動,而在 Y 中按引用傳遞則需要複製。但是,需要注意的是,這種最佳化取決於編譯器的功能,並且始終建議進行分析以確定實際的效能影響。

以上是「想要速度?按值傳遞」總是正確的:按引用傳遞何時優於按值傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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