c – 从函数发回向量
发布时间:2020-12-16 10:27:03 所属栏目:百科 来源:网络整理
导读:如何将以下 Java代码正确转换为C? Vector v;v = getLargeVector();...Vector getLargeVector() { Vector v2 = new Vector(); // fill v2 return v2;} 所以这里v是一个参考.该函数创建一个新的Vector对象并返回对它的引用.干净整洁. 但是,让我们看看以下C镜
如何将以下
Java代码正确转换为C?
Vector v; v = getLargeVector(); ... Vector getLargeVector() { Vector v2 = new Vector(); // fill v2 return v2; } 所以这里v是一个参考.该函数创建一个新的Vector对象并返回对它的引用.干净整洁. 但是,让我们看看以下C镜像转换: vector<int> v; v = getLargeVector(); ... vector<int> getLargeVector() { vector<int> v2; // fill v2 return v2; } 现在v是一个向量对象,如果我理解正确,v = getLargeVector()会将函数返回的向量中的所有元素复制到v,这可能很昂贵.此外,在堆栈上创建v2并返回它将导致另一个副本(但我知道现代编译器可以优化它). 目前我正是这样做的: vector<int> v; getLargeVector(v); ... void getLargeVector(vector<int>& vec) { // fill vec } 但我觉得这不是一个优雅的解决方案. 所以我的问题是:做到这一点的最佳做法是什么(通过避免不必要的复制操作)?如果可能的话,我想避免正常的指针.到目前为止,我从未使用智能指针,我不知道他们是否可以在这里提供帮助. 解决方法
大多数C编译器实现了
return value optimization,这意味着您可以从函数中有效地返回类,而无需复制所有对象的开销.
我还建议你写: vector<int> v(getLargeVector()); 这样你就可以复制构造对象而不是默认构造,然后运算符赋值给它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |