【问题标题】:by-value return in functions of c++c++函数中的按值返回
【发布时间】:2011-01-12 10:37:33
【问题描述】:

这段代码在 c++ 中是否正确?

list<int> makelist(int litem)
{
    list<int> newList;
    newList.push_front(litem);
    return newList;
}

按值返回列表(#include &lt;list&gt;)是否会产生问题?

【问题讨论】:

  • 这样做没有问题,问题在于返回一个指针或对将消失的本地对象的引用。这将复制列表,或者至少表现得好像它有
  • 如果我们不知道您的list 类型,我们如何知道这是否正确?
  • 我不知道“#include 列表”是什么意思。
  • @sbi:应该不管类型是什么。无论类型是什么,代码都应该可以工作(除非返回的类型有错误,但这不是 makelist() 的问题)。

标签: c++ pass-by-value


【解决方案1】:

如评论所述,按值返回通常会被优化掉(在打开优化的情况下运行时)。因此,如果速度是问题(在分析器证明它之前不应该),你不应该担心。另一方面,如果列表在复制时有一些奇怪的副作用,您应该注意复制构造函数调用的数量会因编译器和设置而异。

【讨论】:

    【解决方案2】:

    它会工作,但效率不高,因为可能会复制大量内存。在下一个 C++ 标准中,这个问题可以得到解决。 我建议使用以下代码:

    void fillList(list & lst) {
       lst.push_front(...);
    }
    ....
    list newList;
    fillList(newList);
    

    【讨论】:

    • 你确定它效率低吗?据我了解,C++ 优化器关心它并且不做任何内存复制!哦,看来我是对的,请阅读上面@nice_blonde_stupid_girl 的评论。
    • 我建议你不要这样做,除非分析表明这是一个瓶颈。可能的返回值优化会解决这个问题,即使没有,也应该将此类优化保留到需要时使用,而不是过早应用。
    【解决方案3】:

    您不能返回不是简单类型(int、float、char)的本地对象,但可以返回指向新对象的指针:

    list<int>* makelist(int litem)
    {
        list<int>* newList = new list<int>();
        newList->push_front(litem);
        return newList;
    }
    

    注意你必须管理指针以避免内存泄漏。

    【讨论】:

    • 这是完全错误的。唯一不能为每个副本返回的类型是那些阻止复制的类型。
    • 我很抱歉,但 c++ 可以按值返回任何本地对象,只要它们可以以一种或另一种方式复制即可。不需要指针。这个答案是完全错误的。
    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 2015-12-28
    • 2017-08-12
    • 1970-01-01
    • 2022-07-21
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多