为什么三元运算符阻止MSVC中的返回值优化(RVO)?考虑以下完整示例程序:
#include <iostream> struct Example { Example(int) {} Example(Example const &) { std::cout << "copy\n"; } }; Example FunctionUsingIf(int i) { if (i == 1) return Example(1); else return Example(2); } Example FunctionUsingTernaryOperator(int i) { return (i == 1) ? Example(1) : Example(2); } int main() { std::cout << "using if:\n"; Example obj1 = FunctionUsingIf(0); std::cout << "using ternary operator:\n"; Example obj2 = FunctionUsingTernaryOperator(0); }
用VC 2013编译:cl / nologo / EHsc / Za / W4 / O2 stackoverflow.cpp
输出:
using if: using ternary operator: copy
显然,三元操作符以某种方式阻止RVO.为什么?为什么编译器不够聪明才能看到使用三进制运算符的函数与使用if语句的函数相同,并相应地进行优化?
解决方法
看看程序输出,在我看来,实际上,编译器在这两种情况下都很难看,为什么?
因为,如果没有激活,则正确的输出将是:
>在函数返回时构造示例对象;
>复制到一个临时的;
>将临时复制到主函数中定义的对象.
所以,我希望在我的屏幕上至少有2个“复制”输出.实际上,如果我执行你的程序,用g编译,使用-fno-elide-constructor,我从每个函数得到2个复制消息.
有趣的是,如果我做同样的clang,当功能FunctionUsingTernaryOperator(0);我有3“复制”消息.被调用,我猜,这是由编译器如何实现三进制的.我猜这是生成一个临时的来解决三元运算符,并把这个临时拷贝到return语句.
原文地址:https://www.jb51.cc/c/116012.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。