“想要速度?按價值傳遞” - 探索性能影響
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)。然而,仔細檢查發現,結果取決於傳遞的參數類型(左值或右值):
通常,移動比傳遞指針更快,這本質上就是透過引用傳遞的作用。因此,對於右值,X 的性能優於 Y,而對於左值,性能相似。
需要注意的是,這不是通用規則,最佳化可能會根據編譯器和平台的不同而有所不同。建議進行分析以確定特定情況下的最佳方法。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3