我编写了按值返回巨大对象的函数。我的同事抱怨它会做冗余复制,并建议通过引用返回对象作为函数参数。我知道将完成返回值优化并消除副本,但代码将用于可由不同编译器编译的库中,我无法对所有编译器进行测试。为了让我的同事相信按价值返回对象是保存的,我需要一些说明它的文档。
我查看了 c++03 标准,但找不到任何关于返回值优化的信息。您能否提供一个文档(标准)的链接,其中定义了 RVO 将被执行。或者,如果它不存在,我可以在哪里找到支持 RVO 的编译器列表?
我编写了按值返回巨大对象的函数。我的同事抱怨它会做冗余复制,并建议通过引用返回对象作为函数参数。我知道将完成返回值优化并消除副本,但代码将用于可由不同编译器编译的库中,我无法对所有编译器进行测试。为了让我的同事相信按价值返回对象是保存的,我需要一些说明它的文档。
我查看了 c++03 标准,但找不到任何关于返回值优化的信息。您能否提供一个文档(标准)的链接,其中定义了 RVO 将被执行。或者,如果它不存在,我可以在哪里找到支持 RVO 的编译器列表?
该标准从不保证 RVO 发生,它只是允许它发生。
您可以检查生成的实际代码以了解它是否发生,但这仍然不能保证它将来仍然会发生。
但最后,在许多情况下,每个体面的编译器都可以执行 RVO,即使没有发生 RVO,C++11(及更高版本)移动构造也可以使返回相对便宜。
您可以用来向您的同事证明 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"
}
然后运行有问题的代码,并验证是否已构造/复制了预期数量的对象。