我应该返回堆对象的引用还是返回值?

Cor*_*tex 3 c++ performance memory-management reference

我有这两个简单的功能.我认为这func1是一个很好的解决方案,因为你通过引用传递一个对象.我的教科书给出func2了最佳解决方案的答案.这只是因为你没有解除分配heapstr吗?如果我heapstr在main中声明然后将它传递给函数,那么我之后能够将其删除怎么办?

#include <iostream>

using namespace std;


string& func1(const string &str) {
    string* heapstr=new string();
    for (int i = 0; i < str.size(); ++i) {
        *heapstr += str[i];
    }
    return *heapstr;
}

string func2(const string &str) {
    string heapstr;
    for (int i = 0; i < str.size(); ++i) {
        heapstr += str[i];
    }
    return heapstr;
}

int main() {
    cout << func1("aaa") << endl;
    cout << func2("aaa") << endl;
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ckl 6

我应该返回堆对象的引用还是返回值?

按价值返回.

有很多原因,但没有一个与性能有关,因为编译器在优化方面已经足够好了,即使不是,大多数程序都受I/O限制,即等待数据的时间从文件或网络套接字中获取所有性能,而不是CPU操作本身所花费的时间.

例如,参见Herb Sutter和Bjarne Stroustrup撰写的"C++核心指南",其中 "按价值返回容器(依靠移动或复制省略效率)"部分说:

原因

简化代码并消除对显式内存管理的需求.

至于你的两个功能......

我的教科书给出func2了最佳解决方案的答案.这只是因为你没有解除分配heapstr吗?

内存泄漏是其中一个问题.但重点是,按值返回更简单,更不容易出错.这都是关于正确性,而不是速度.int*如果你能回来int,你就不会回来了,不是吗?

如果我宣布heapstrmain,然后将它传递给函数,所以我能够然后删除呢?

您将在代码中引入许多内存泄漏,崩溃和未定义行为的可能性.它会变得更长,更难写,更难阅读,更难维护,更难调试,更难以在代码审查中证明其合理性.作为回报,你绝对不会获得任何收益.