」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 按值傳遞或引用傳遞:「想要速度?按值傳遞」何時是真的?

按值傳遞或引用傳遞:「想要速度?按值傳遞」何時是真的?

發佈於2024-11-08
瀏覽:167

  Passing by Value or Reference: When is \

“想要速度?按價值傳遞” - 探索性能影響

Scott Meyers 的聲明“想要速度?按價值傳遞”提出了問題關於按值傳遞物件與按引用傳遞物件的效能優勢。在這種情況下,按值傳遞涉及複製操作,而按引用傳遞則避免了不必要的複製。

考慮以下結構體 X 和 Y 的例子:

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) {}
};

在 X 的建構子中,在呼叫 std::string 上的移動建構函式以初始化 mem_name 之前,參數名稱會被複製到暫存物件。在 Y 的建構子中,參數名稱是 const 引用,但仍會進行複製以初始化 mem_name。因此,X 執行「複製然後移動」操作,而 Y 執行單一複製。

根據 Meyers 的論點,按值傳遞(如 X 中)似乎會更快,因為最佳化的潛力,例如傳回值最佳化 (RVO)。然而,仔細檢查發現,結果取決於傳遞的參數類型(左值或右值):

  • Lvalues:X 和Y 都會執行複製(在初始化name 時為X,初始化mem_name 時為Y),然後在X 中進行移動操作。
  • Rvalues:如果可以套用 RVO,X 可能只執行移動,而 Y 仍然需要副本。

通常,移動比傳遞指針更快,這本質上就是透過引用傳遞的作用。因此,對於右值,X 的性能優於 Y,而對於左值,性能相似。

需要注意的是,這不是通用規則,最佳化可能會根據編譯器和平台的不同而有所不同。建議進行分析以確定特定情況下的最佳方法。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3