c – 为什么三元运算符防止返回值优化?

为什么三元运算符阻止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语句.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...