「想要速度?傳遞價值」和效能最佳化
在處理大量複製作業時,開發人員通常會努力優化效能。這個前提引出了斯科特·邁耶斯 (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中文網其他相關文章!