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)
我应该返回堆对象的引用还是返回值?
按价值返回.
有很多原因,但没有一个与性能有关,因为编译器在优化方面已经足够好了,即使不是,大多数程序都受I/O限制,即等待数据的时间从文件或网络套接字中获取所有性能,而不是CPU操作本身所花费的时间.
例如,参见Herb Sutter和Bjarne Stroustrup撰写的"C++核心指南",其中 "按价值返回容器(依靠移动或复制省略效率)"部分说:
原因
简化代码并消除对显式内存管理的需求.
至于你的两个功能......
我的教科书给出
func2了最佳解决方案的答案.这只是因为你没有解除分配heapstr吗?
内存泄漏是其中一个问题.但重点是,按值返回更简单,更不容易出错.这都是关于正确性,而不是速度.int*如果你能回来int,你就不会回来了,不是吗?
如果我宣布
heapstr在main,然后将它传递给函数,所以我能够然后删除呢?
您将在代码中引入许多内存泄漏,崩溃和未定义行为的可能性.它会变得更长,更难写,更难阅读,更难维护,更难调试,更难以在代码审查中证明其合理性.作为回报,你绝对不会获得任何收益.
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |