【发布时间】:2021-11-15 12:46:58
【问题描述】:
我知道标准不支持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);
}
(我的实际用例对于复杂的用户定义类型是可选的,但我希望长字符串在编译器方面也能做到这一点)
在这种情况下,与DoStuff 相比,DoStuffRef 是否实际上节省了任何复制工作?
我试图查看 Godbolt 输出,但我不知道足够的汇编来确定。我确实看到在DoStuff 的情况下,似乎创建了一个临时std::optional<T>,而DoStuffRef 中不存在所以我怀疑是的,通过引用传递optional 保存一些复制
感谢您的帮助!
【问题讨论】:
-
是的,当可选项实际包含字符串时,您会保存一份副本。
标签: c++ stdoptional