return()

时间:2018-08-28 21:48:45

标签: c++ c c++11 return

我目前正在自学C和C ++。
我找不到类似的问题,但我想对C和C ++设计实践进行一些很好的解释。

  1. return()返回类型的函数调用是一种好的编码习惯吗?
  2. 这是我什至应该考虑的问题吗?或者这是一个愚蠢的问题吗?

说明:

bool A (blah, blah)
{
    bool a = false;
    a = B(); // B returns bool type
    return a;

    // OR

    return (B());
}
  1. 两者都可以编译和运行,但是在速度,内存效率等指标方面要好于另一个。
  2. 使用其中一个的原因可能是什么?或者我问这个问题是在浪费时间吗?

7 个答案:

答案 0 :(得分:5)

如果您打算在从B返回之前用返回值A做某事,请继续进行存储。如果B的返回值将是A的返回值,则只需return B()

答案 1 :(得分:2)

您只能返回B(),但是如果仅在A类中放置此语句,则该类没有任何意义。在这种情况下,请调用B()而不是A()并删除A()

答案 2 :(得分:2)

无论如何,编译器都会(可能)将您的bool a = B(); return a;优化为return B(),因此您正在浪费时间。编译器甚至可能只是在您编写B()的地方放置 A()

除非有问题(或期望有问题),否则不要花太多时间进行优化。专注于使其正常工作并保持代码清晰。

从其他函数返回结果是很常见的(而且很好)。

答案 3 :(得分:1)

这两种方法都很常见,这取决于首选的编码样式。

它们之间没有明显的速度差异。

正如dbush提到的,使用第一种方法的一个原因是,如果您需要在返回B()之前对其进行处理。

答案 4 :(得分:1)

这将是最少的问题,并将分解为个人选择。一个好的编译器将能够以一种在大多数情况下没有区别的方式进行优化。

但是,C ++ 17保证了第二种情况下的返回值优化,在某些情况下可能会更好。

返回值优化(RVO)是一个过程,其中返回的对象永远不会存储在临时对象中。

那么您应该如何决定:

如果要在B()范围内使用A的结果,则要存储它。否则,直接写return B();

答案 5 :(得分:1)

在代码方面没有区别。编译发行版本时,编译器应该能够将它们优化为同一事物。

但是在调试版本中使用变量有一点优势。您可以轻松地在返回处放置一个断点,然后在返回之前查询变量的状态。

bool A (blah, blah)
{
    bool a = B();
    return a;        // Set break point here.
}                    // In debugger you can see the value of a
                     // before telling the compiler to continue.

答案 6 :(得分:0)

嗯,两者都有坏处:

  1. 首先是不必要的聊天。如有疑问,请尽量简洁。
    在C或C ++ 11中,就是这样,在C ++ 17中,它失去了保证的复制选择的功能,这可能与更复杂的类型有关。
  2. 第二个使用多余的括号,使return看起来像是一个函数调用。
    在C或C ++ 11中就是这样,但是在带有decltype(auto) return-type-deduction的C ++ 14中,这会导致推导引用。

    // C++14 examples:
    decltype(auto) returns_value(int i) { return i; }
    decltype(auto) returns_dangling_reference(int i) { return (i); }
    

最后,它应该很简单:

return B();

因此,您将获得所有优势,并避免所有陷阱。