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

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

概述为什么三元运算符阻止MSVC中的返回值优化(RVO)?考虑以下完整示例程序: #include <iostream>struct Example{ Example(int) {} Example(Example const &) { std::cout << "copy\n"; }};Example FunctionUsingIf(int i){ if (i 为什么三元运算符阻止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 – 为什么三元运算符防止返回值优化?全部内容,希望文章能够帮你解决c – 为什么三元运算符防止返回值优化?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1234325.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存