我希望有人可以阐明 RVO 在 g++ 中的作用。我有一些需要修改的第三方软件,我想尽可能地对其进行优化,但我无法弄清楚 RVO 究竟做了什么,以及它何时启动。我目前的结构看起来像:
class Foo {
private:
Bar myBar;
public:
Bar &getBar() { return myBar; };
};
调用者通常这样使用它:
int x = foo.getBar().getX();
因为返回是一个引用,所以不需要结构的副本,这对性能来说很好。
我需要修改Foo
以使用Bar2
而不是Bar
其内部结构,但是,我需要保持getBar()
接口可供第三方调用者使用。我有一个函数convertBar2ToBar(const struct Bar2 &bar2, struct Bar &bar)
,它可以有效地在两种结构类型之间进行转换,但我很担心,好像我这样做了:
Bar& Foo::getBar() { Bar rt; convertBar2ToBar(myBar2, rt); return rt }
然后这将返回对堆栈上的变量的引用,该变量可以随意书写。我也可以修改程序以返回如下副本rt
:
Bar Foo::getBar() { Bar rt; convertBar2ToBar(myBar2, rt); return rt }
但是现在我担心我的Foo.getBar().getX()
速度会很慢,因为它必须转换Bar2
为rt
(不可避免),然后将'rt'复制到调用者的本地上下文中(可以避免???)......我不是清楚 RVO 是否可以防止复制,如果可以,幕后到底发生了什么。