C++我可以期望所有编译器都不会销毁返回的副本
C++ can I expect all compilers to not destroy the copy being returned?
#include <iostream>
using namespace std;
class ClassA {
int k;
public:
ClassA(int i) : k(i)
{
}
~ClassA()
{
cout << "A destroyed" << " k=" << k << endl;
}
ClassA copyAndModify()
{
ClassA a(k*2);
return a;
}
void taunt()
{
cout << k << endl;
}
};
int main (int argc, char * const argv[]) {
ClassA original(1)
ClassA modified = original.copyAndModify();
modified.taunt();
return 0;
}
我认为对象"a"(方法copyAndModify内部)在方法返回时被解构了,但事实并非如此。这是否意味着在方法中创建的返回的所有对象都不会被解构?所有编译器都是如此吗?
您遇到了返回值优化。 不,它不会在所有编译器上都相同。
这取决于编译器,但通常当方法按值返回对象实例时,编译器可以使用 RVO(返回值优化)通过将目标对象作为隐藏的引用参数传递来防止创建临时对象。换句话说,编译器会调整生成的代码,使其像您编写代码一样,如下所示:
void copyAndModify(ClassA &result)
{
ClassA a(k*2);
result = a;
}
ClassA modified;
original.copyAndModify(modified);
在VS的情况下,如果您在调试模式下构建,则不会进行任何优化(对象将被销毁),但在发布模式下,优化会启动(对象不会被销毁)。
没
错。 如果它被退回,它不会被销毁。 这是有道理的。 返回已销毁的对象是没有意义的。
相关文章:
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 如何在模板类中返回成员变量的副本
- 如何声明接受转发引用并返回引用或副本的函数模板
- 有条件的操作员从其参数的副本中返回值
- 我可以返回副本作为参考吗?
- 返回不带副本 ctor 的引用
- 'std::any_cast' 返回一个副本
- 按值副本返回,而不是移动
- 参考参数返回副本
- C++方法返回自身副本时内存泄漏
- 为什么迭代器运算符 + 返回副本
- 节点.js C++ 插件:返回新副本
- 如何通过制作副本从函数返回引用
- 为什么返回 std::vector 仍然是在制作副本
- 就地修改并返回副本有意义吗
- 为什么在 constexpr 函数中允许返回对常量指针的引用,但不返回副本
- 按方法返回副本或引用
- 在c++中通过成员函数返回引用比返回副本快
- 由于继承,堆栈返回副本