在下面的代碼中
std::string OtherFunc();
std::string MyFunc() {
if (condition1) return "result 1";
if (condition2) return "result 2";
return OtherFunc();
}
將MyFunc()啟用復制省略(對于來自 的回傳字串OtherFunc())?我知道我會寫
std::string MyFunc() {
std::string ret;
if (condition1) {
ret = "result 1";
return ret;
}
if (condition2) {
ret = "result 2";
return ret;
}
ret = OtherFunc();
return ret;
}
到 100% 確定啟用復制省略。但我認為第二個代碼非常繁瑣。
uj5u.com熱心網友回復:
std::string您展示的第一個示例中沒有復制/移動。(C 17 起)
在第二個變體中,從ret函式到回傳值的移動(或從它初始化的任何物件)可能會被忽略(稱為回傳值優化 (NRVO)),但這并不能保證,即使在 C 17 中也是如此。
此外,在第二個示例中,即使應用了 NRVO,也需要對ret = OtherFunc();第一個版本中不需要的行進行移動賦值運算子呼叫。
因此,就所需的復制/移動操作而言,第一個版本肯定更好。(std::string移動仍然可能很便宜,因此差異可能不夠顯著,以至于其他因素不會決定整體表現。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/451613.html
標籤:C
上一篇:SendGrid:'source'不是內部或外部命令、可運行程式或批處理檔案
下一篇:向量的快速排序<字串>
