“想要速度?按價值傳遞” - 探索性能影響
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 的建構子中,在呼叫std::string 上的移動建構子以初始化mem_name 之前,參數名稱會被複製到臨時物件。在 Y 的建構子中,參數名稱是 const 引用,但仍會進行複製以初始化 mem_name。因此,X 執行「複製然後移動」操作,而 Y 執行單一複製。
根據 Meyers 的論點,按值傳遞(如 X 中)似乎會更快,因為最佳化的潛力,例如返回值最佳化 (RVO)。然而,仔細檢查發現,結果取決於傳遞的參數類型(左值或右值):
通常,移動比傳遞指標更快,這本質上就是透過引用傳遞的作用。因此,對於右值,X 的性能優於 Y,而對於左值,性能相似。
需要注意的是,這不是通用規則,最佳化可能會根據編譯器和平台的不同而有所不同。建議進行分析以確定特定情況下的最佳方法。
以上是按值傳遞或引用傳遞:「想要速度?按值傳遞」何時是真的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!