首頁  >  文章  >  後端開發  >  按值傳遞或引用傳遞:「想要速度?按值傳遞」何時是真的?

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

Susan Sarandon
Susan Sarandon原創
2024-10-27 01:34:03526瀏覽

  Passing by Value or Reference: When 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 的建構子中,在呼叫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,而對於左值,性能相似。

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

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn