我继续阅读关于RVO并通过引用vs值传递参数。我明白了:通过引用传递只是传递指针的语法糖,并且通过值调用类的复制构造函数来为要使用的函数创建原始对象的副本。 RVO避免为函数的返回值调用复制构造函数。
我理解的缺点是,当值和值返回的对象传递的参数的确切构造何时发生。我假设通过值传递的对象是在实际调用之前在堆栈上构造的,返回值是在返回之前复制构造的(在没有RVO的情况下)。这是对的吗?
答案 0 :(得分:2)
你的假设非常正确。对于传递值, object是在参数所在的位置构造的 通常在调用函数之前的某个时间传递(但是 在前一个声明之后),并且之前被破坏了 从函数返回,就好像它们是局部变量一样 功能。对于通过引用传递,构造对象 在堆栈上(或通常构建临时的地方), 并在完整表达结束时被破坏。回来 值,该对象由被调用的函数构成,在 return语句(但在局部变量的析构函数之前) 被叫,并被被叫者破坏,在结束时 充分表达。
答案 1 :(得分:1)
简答:是的
答案很长:是的,请参阅asm以获取更多详细信息:D
附加信息:参数的评估顺序取决于您的编译器
答案 2 :(得分:1)
通常,你是对的。
有一个奇怪的概念“返回值Elision”或“复制Elision”。从本质上讲,一些编译器足够聪明,可以看到你按价值返回,并且会全部到位(在某些情况下,我发现任何编译器都没有足够可靠地确保RHR或返回值优化不是很有帮助)。
本质:
std::vector<int> foo();
std::vector<int> bar = foo();
可能实际上使用bar里面的内存作为返回值。
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
所以它可能发生。我从不相信它......