为何C++返回T时不对std::optional<T>执行RVO优化?
为什么返回T类型对象时,C++不对std::optional执行RVO?
我遇到了一个关于返回值优化(RVO)的问题:当返回T类型对象时编译器能正常触发RVO,但返回std::optional<T>时,直接返回T的临时对象却无法触发优化,必须手动构造std::optional<T>再返回才能让编译器执行RVO,示例代码如下:
struct Bar {}; std::optional<Bar> get_bar() { return Bar{}; // 此处调用Bar的移动构造函数,未执行RVO } Bar get_bar2() { return Bar{}; // 未调用移动构造函数,执行了RVO } std::optional<Bar> get_bar_rvo() { std::optional<Bar> opt; opt.emplace(); return opt; // 未调用移动构造函数,执行了RVO }
上述代码中,get_bar2顺利触发了RVO,没有调用任何构造函数;但get_bar却会调用Bar的移动构造函数,无法触发RVO。只有像get_bar_rvo那样手动构造std::optional<T>对象再返回,才能让编译器执行RVO,但这样写代码会变得冗长繁琐。
根据cppreference文档,我知道get_bar不符合强制省略复制/移动操作的要求:
在初始化对象时,当初始化表达式是与变量类型(忽略cv限定符)相同的类类型的纯右值时:
因为std::optional<T>和T并非相同类类型,所以RVO不是强制要求的。但我认为对std::optional<T>的这种场景执行RVO应该非常简单且实用,没必要手动写get_bar_rvo这种繁琐的代码。为什么我的编译器不能像优化get_bar2一样优化get_bar?
编译环境:MacOS
Apple clang version 13.1.6 (clang-1316.0.21.2.5) Target: arm64-apple-darwin21.6.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
编译选项:-std=c++17 -O3
内容的提问来源于stack exchange,提问作者Bin Yan
相关产品推荐
相关产品推荐

