gpt4 book ai didi

c++ - 为什么按值返回时总是调用复制构造函数

转载 作者:太空狗 更新时间:2023-10-29 23:44:10 26 4
gpt4 key购买 nike

当一个函数按值返回一个对象时,它会调用复制构造函数来创建一个临时对象(除非应用了RVO)。该临时文件将在使用后销毁,例如

MyClass function_return_by_value(MyClass par)
{
return par;
}
MyClass b;
MyClass a = function_return_by_value(b); // (1)

但如果根本不使用,为什么我们需要创建这样一个临时文件呢?例如,为什么下面的代码没有被编译器“优化”以跳过临时创建和销毁?

MyClass b;
function_return_by_value(b); // (2)

在(1)中,返回值被赋值给另一个变量,很可能适用RVO。但是在(2)中,没有任何东西可以接收返回值,为什么没有进行优化呢?我已经尝试过 gcc 4.8.4 和 vc++ 2015,MyClass 的复制构造函数在两个编译器中为 (2) 调用了两次。为什么编译器制造商都决定制作一个临时文件然后销毁它,即使根本没有使用临时文件?他们为什么不能避免这种情况?

最佳答案

当 RVO 删除它时,编译器可以删除拷贝的副作用(这本身就很有争议),但是优化编译器不能简单地将对象的整个存在从程序中删除,因为只要构建和/或破坏它就有副作用。

这将使下面的程序不输出任何内容,这显然是错误的:

#include <iostream>

struct A
{
A() { std::cout << "Booyah\n"; }
};

int main()
{
A a;
}

关于c++ - 为什么按值返回时总是调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com