【发布时间】:2014-12-04 10:48:07
【问题描述】:
C++ 编译器是否能够将 RVO 应用于虚函数?
在这种情况下:
class AbstractReader
{
//...
public:
virtual std::vector<float> getFloatVector() = 0;
//...
}
class XmlReader : public AbstractReader
{
//...
public:
virtual std::vector<float> getFloatVector()
{
std::vector<float> result;
//Do some parsing here...
return result;
}
//...
}
class BinaryReader : public AbstractReader
{
//...
public:
virtual std::vector<float> getFloatVector()
{
std::vector<float> result;
//Do some decoding here...
return result;
}
//...
}
RVO 可以应用于return result; 行吗?我猜不会。
那么,在这种情况下,std::move(result) 是返回大型容器的方法吗?
谢谢
【问题讨论】:
-
你能澄清你的问题吗?你经常返回虚函数吗?
-
@juanchopanza:我认为问题在于 RVO 是否在在虚函数内工作,即对于虚函数可能返回的任何内容,而不是 RVO 在返回虚函数时是否工作。 (而且我认为这在原则上不应该起作用)
-
@Damon 我也这么认为,但最好让 OP 解释他们真正要问的意思。
-
虚拟机制只是用来选择调用哪个函数。在选择之后,我认为无论选择什么实际功能都会在适当的情况下将 RVO 编译到其中。我没有看到编译器在处理每个特定函数时需要知道其他函数做了什么。
-
我不知道 RVO 是如何工作的,但我猜想链接器必须知道 RVO 是否发生。 RVO 机制对调用者完全透明吗?