这三种函数返回方式之间是否存在性能差异(c++)

A Function1()
{
    return {1};
}

A Function2()
{
    return A{1};
}

A Function3()
{
    A a{1};
    return a;
}

我尝试了三种方法。它们都只调用一个赋值构造函数。

我的问题取决于使用哪个编译器,性能可能会有所不同?

回答

有细微的差别:

  • Function1需要非显式A的构造函数。构造A“就地”(甚至在 C++17 之前)。所以复制/移动 A 的构造函数甚至可能被标记为= delete,并且程序格式良好。

  • C++17 之前,Function2将使用可能被省略的移动/复制构造函数(返回值优化:RVO)(尽管复制/移动构造函数应该可用(标记为= delete不会编译))。
    在 C++17 之后,没有完成移动/复制(类似于Function1,但使用explicit构造函数)。

  • Function3 将使用可能被省略的移动/复制构造函数(命名返回值优化:NRVO)。

使用正确的选项,编译器将进行优化,并且一切都应该是等效的。

使用诸如-fno-elide-constructors, pre-c++17, Function1should win, post C++17, Function1and Function2should win之类的选项。


以上是这三种函数返回方式之间是否存在性能差异(c++)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>