我编写的函数按值返回大对象。我的同事抱怨它会做冗余复制并建议通过引用返回对象作为函数参数。我知道将完成返回值优化并且将删除副本,但代码将用于可由不同编译器编译的库中,并且我无法对所有这些编译器进行测试。为了说服我的同事保存按值返回对象,我需要一些文件说明。
我查看了c ++ 03标准,但找不到任何有关返回值优化的信息。您能否给出一个文件(标准)的链接,其中定义了RVO将被完成。或者,如果它不存在,我可以找到支持RVO的编译器列表?
答案 0 :(得分:2)
该标准永远不会保证RVO发生,它只是允许它。
您可以检查生成的实际代码,以确定它是否发生,但这仍然无法保证将来仍会发生。
但最后,在许多情况下,每个体面的编译器都可以执行RVO,即使没有发生RVO,C ++ 11(及更高版本)移动构造也可以使返回相对便宜。
答案 1 :(得分:1)
您可以用来向同事证明RVO正在完成的一种方法是在代码中放置printfs或其他类似的语句。
HugeObject& HugeObject::operator=(const HugeObject& rhs)
{
printf("HugeObject::operator= called\n");
}
和
HugeObject::HugeObject(const HugeObject& rhs)
{
printf("HugeObject::copy constructor called\n");
}
和
HugeObject SomeFunctionThatCreatesHugeObject()
{
...
printf("SomeFunction returning HugeObject\n"
}
然后运行有问题的代码,并验证是否已构造/复制了预期的对象数。