c – 从函数发回向量

c – 从函数发回向量,第1张

概述如何将以下 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());

这样你就可以复制构造对象而不是默认构造,然后运算符赋值给它.

总结

以上是内存溢出为你收集整理的c – 从函数发回向量全部内容,希望文章能够帮你解决c – 从函数发回向量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1220249.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存