【问题标题】:Do I get a performance issue, if i do not care about a return value如果我不关心返回值,我是否会遇到性能问题
【发布时间】:2013-09-28 11:00:48
【问题描述】:

简介:我有一个函数在做一些工作并返回一个布尔值。如果发生错误,布尔值应该为假。所以如果我想检查错误,我可以使用布尔值。但是,如果我完全确定(我知道,你永远无法完全确定,但也许你明白我的意思)这部分不会有错误,或者你只是不在乎是否有错误,因为它没有影响。

问题:如果我没有“捕获”返回的布尔值,是否会发生一些内存泄漏或其他性能问题?

最低代码示例:

bool my_func(/*some variables*/)
{
    if(/*error-condition*/)
    {
        //do something
        return false;
    }
    else if(/*other error-condition*/)
    {
        //do something
        return false;
    }
    return true;
}


int main(void)
{
    my_func(/*variables*/);
    return 0;
}

评论:不会返回任何编译或运行时错误或未处理的异常

【问题讨论】:

    标签: c++


    【解决方案1】:

    函数返回值总是可以被忽略,除非它们告诉你关于函数已经消耗和未释放的资源的信息;例如

    1) 包含指向函数分配的内存指针的指针或结构

    2) 包含指向函数打开的文件/流缓冲区的指针或结构

    在选择忽略返回值之前,您应该始终检查函数文档。

    【讨论】:

    • 返回文件句柄是一个很好的“陷阱”,因为它在许多文件系统上作为整数传递 - 并且应该使用相应的关闭函数干净地关闭。
    • 即使它作为指针传递(即FILE*,你仍然不应该调用freedelete,而是fclose
    【解决方案2】:

    在C++中内存只能对动态存储时长的对象进行泄漏,即用newstd::malloc分配的对象(cmp.C++11 3.7.4/1)

    您的函数中的bool 将是一个临时的,或者换句话说,它具有自动存储持续时间(cmp.C++11 3.7.3/1),因此完全可以忽略它。

    【讨论】:

    • 您无法知道编译器将您的对象放在哪里,因为标准没有说明堆或堆栈。它只定义了存储类类型和生命周期类型;)
    • @Zaibis 你是个吹毛求疵的人!我喜欢。已更正。
    • 是的,不是动态分配,没有泄漏。
    【解决方案3】:

    不,这是一个void语句,bool被丢弃

    【讨论】:

      【解决方案4】:

      您可以随意忽略它,因为返回值不会被使用。 这只是一个无效的声明,这与在您的代码中编写 2;identifiername; 完全一样。

      它会被调用,但由于您没有存储该值,因此不会发生其他任何事情。

      【讨论】:

        【解决方案5】:

        不,不会有性能损失或内存泄漏。 但是,一般情况下,异常是处理 C++ 错误的正确方法。

        【讨论】:

          【解决方案6】:

          如果函数的返回值不是指向从函数内部分配且未在该函数中释放的内存的指针,您可以放心地忽略它。

          【讨论】:

          • 谢谢,你能提供一些来源吗?因为我在网上找不到任何东西:(
          • @Zaibis this question implies that you can 我确信我在过去的某个地方做过......
          • @Zaibis,返回结构是完全合法的,返回数组是不合法的(指向数组的指针很好)。
          • @PP。如果我没记错的话,在汇编代码中实现返回值的一种流行方法是在要调用的函数范围“下方”的堆栈上保留一些空间。 IE。该函数在其自己的堆栈范围下方写入返回值(如果没有执行return 语句,则未初始化)
          • @Martin 实际上 this Wikipedia article 声明您可以忽略函数返回值。
          猜你喜欢
          • 1970-01-01
          • 2016-03-28
          • 1970-01-01
          • 2018-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-12
          • 2011-12-23
          相关资源
          最近更新 更多