我想问一下如何高效地返回一个std::optional
,我想使用std::make_optional()
。例如,让我们有这样的代码片段:
std::optional<Path> CreateCanonicalPath(const std::string_view& path)
{
std::error_code errorCode;
const auto result = std::filesystem::weakly_canonical(std::filesystem::u8path(path), errorCode);
return !errorCode ? std::make_optional(result) : std::nullopt;
}
我特别感兴趣的是result
到std::make_optional
的传递是否有优化,使用std::make_optional(std::move(result))
会不会更好?result
是一个局部变量,但它并不完全在一个返回语句中,所以我假设编译器不能自己使用move。
1条答案
按热度按时间bvjveswy1#
有一个明显的改进:
创建临时对象
const
需要使用复制构造作为示例化返回的std::optional
的一部分。在此之后,任何进一步的改进都将在很大程度上取决于编译器的行为。这是不太可能的,但如果进行基准测试,可以观察到一些小的性能差异与替代语法,例如:
如果确定编译器会选择取消拷贝,这是NVRO允许的,那么也值得对此进行基准测试,但只有实际的基准测试才会产生有用的结果。