我知道std::optional<T&>在標準中并不支持。這個問題是關于傳遞std::optional<T>&是否有任何性能優勢
示例代碼(https://godbolt.org/z/h56Pj6d6z)轉載于此
#include <ctime>
#include <iomanip>
#include <iostream>
#include <optional>
void DoStuff(std::optional<std::string> str) {
if (str) std::cout << "cop: " << *str << std::endl。
}
void DoStuffRef(const std::optional<std::string> & str) {
if (str) std::cout << "ref: " << *str << std::endl。
}
int main() {
std::optional<std::string> str = {};
DoStuff(str)。
DoStuffRef(str);
str = "0123456789012345678901234567890123456789"。
DoStuff(str)。
DoStuffRef(str);
(我的實際用例是一個復雜的用戶定義的型別的可選性,但我希望一個長字串在編譯器上也能做到這一點)
在這種情況下,與DoStuffRef相比,DoStuff是否真的能節省任何復制作業?
我試著看了一下godbolt的輸出,但是我對匯編的了解不夠,不能確定。我確實看到在DoStuff的情況下,似乎有一個臨時的std::optional<T>被創建,這在DoStuffRef中是不存在的,所以我懷疑是的,通過參考傳遞一個optional可以節省一些拷貝
感激您的幫助!
uj5u.com熱心網友回復:
如果你傳遞實際的std::optional<std::string>,那么是的,將沒有復制。但是如果你只傳遞std::string,那么就必須先構建臨時的option,從而產生一個字串的副本。
uj5u.com熱心網友回復:
DoStuffRef當引數已經是std::option<std::string>(如你的例子)時,會保存一個額外的副本。
但是,如果你直接傳遞一個std::string,那么在這兩種情況下,應該構造一個std::optional,涉及字串的復制/移動構造器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/333967.html
標籤:
