这三种函数返回方式之间是否存在性能差异(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, Function1
should win, post C++17, Function1
and Function2
should win之类的选项。