C++ 我应该在if条件中使用直接函数调用还是首先存储变量?
在以下代码中,检查if条件的首选方法是什么: 使用变量agex或直接函数调用(如下所示)C++ 我应该在if条件中使用直接函数调用还是首先存储变量?,c++,C++,在以下代码中,检查if条件的首选方法是什么: 使用变量agex或直接函数调用(如下所示) #包括 使用名称空间std; 甲级 {公众: 智力年龄; bool checkAgeMinor(); }; boola::checkAgeMinor() { 如果(年龄>=18岁) 返回true; 其他的 返回false; } int main() { A A; bool agex=a.checkAgeMinor(); cout我认为您应该使用agex。根据我的理解,您所做的将再次调用函数,并且在更改程序计
#包括
使用名称空间std;
甲级
{公众:
智力年龄;
bool checkAgeMinor();
};
boola::checkAgeMinor()
{
如果(年龄>=18岁)
返回true;
其他的
返回false;
}
int main()
{
A A;
bool agex=a.checkAgeMinor();
cout我认为您应该使用agex
。根据我的理解,您所做的将再次调用函数,并且在更改程序计数器、为调用函数分配内存等过程中会涉及一些计算时间。而在另一种情况下,我们只需查看特定内存位置的值。因此包括查找。您已经检查了年龄;无需再次检查
您在bool
中已经有了此信息,所以请使用它。将其设置为const
,以便更好地测量
只有当您有理由相信该值在此期间可能已更改(或者存在严重的可读性问题)时,才会再次调用该函数。
- 如果多次使用函数调用结果(如下所示:打印
我建议将其存储到变量中,然后
然后使用变量。这是一个安全的方法,不会中断
如果有人认为该功能应该有副作用,那么
如果多次调用该函数,可能会产生意外结果
- 但是,如果函数具有良好的名称,并且可以预期
无副作用/显著的运行时间,则完全可以
直接调用它多次。例如
getter类似于
getAge()
,它可能不会进行任何计算
而且不会有副作用
- 另一点需要注意的是,如果函数结果可能改变
(无论出于何种原因),您显然必须再次致电
获取更新的结果。在您的情况下,使用
在代码的中间会改变年龄,因此调用函数
多次都没什么用
请注意,我没有对性能做出任何评论。这是因为,除非您的函数很昂贵,否则多次调用它和一次调用它之间的区别基本上是无关的。将bool
存储到变量对编译器来说也或多或少是免费的(因为您的CPU无论如何都与寄存器一起工作),因此存储函数结果与直接使用函数结果之间没有可测量的差别。在证明存在性能问题之前,您不必担心这一点
至于你的具体例子:
您已经存储了bool一次。此时,只需继续使用它。再次调用该函数是没有用的(除非其结果可能不同,但此处不希望年龄发生变化,如果发生变化,代码将中断)。此外,第二个if
应该是第一个的else
分支。当您使用它时,可以给变量一个更好的名称:
// Returns whether age >= 18, I find the function name confusing...
bool isAdult = a.checkAgeMinor();
// What does "Age is true" mean?
cout << "Age is " << isAdult << std::endl;
if (!isAdult)
{
std::cout << "age less than 18" << std::endl;
return 1;
}
else
{
std::cout << "Do something" << std::endl;
return 0;
}
//返回是否年龄>=18,我发现函数名令人困惑。。。
bool isAdult=a.checkAgeMinor();
//“年龄是真的”是什么意思?
cout让我们采取一个非常简单的观点,假设我们不知道checkAgeMinor()
实际在做什么。您使用它返回的值3次。现在让我们假设它返回的值可能在您使用该值的位置之间发生变化。如果是这样,您的代码是否正确?否
你实际上想要的是3倍相同的值,否则你会得到不一致的输出。不要浪费时间去思考实现细节,而是考虑当前范围内的代码应该做什么。它不应该对 CigaGeMimor < /C>的突然变化作出反应,但是它应该调用该方法来获得根据这个价值观做一些事情。所以你真正想要的是:
bool agex = a.checkAgeMinor();
std::cout << "Age is" << agex << '\n';
if(!agex)
{
std::cout << "age less than 18" << '\n';
return 1;
} else {
std::cout << "Do something" << '\n';
return 0;
}
bool agex=a.checkAgeMinor();
std::不能试图智胜编译器。我打赌不管您使用的是变量还是函数调用,它都将被编译到同一个程序集code@VinayShukla如果不再使用结果,我建议不要创建临时变量。如果需要多次访问该值,我将创建临时变量。不仅在性能方面,而且在可读性方面。我已经看过很多次了,但是为什么(条件)返回true;否则返回false;为什么不只是返回条件?@AndrewKashpur没有理由这么做,我也更喜欢返回条件;
顺便说一句,这里的强制性警告是不要太在意“最佳实践”一般来说,通常没有这样的事情。我也有类似的观点,但创建变量的开销比函数调用更优化吗???@VinayShukla为什么你关心哪一个更快?在你展示的程序中,没有可测量的差异。让你的程序快两纳秒是没有意义的。@VinayShukla计算几个t在你的例子中,IME比存储结果的开销更大,为了比较它,结果需要保存在任何地方,无论如何我认为它实际上取决于函数。如果函数较小,那么传入函数可能会更好。但是如果该函数中有1000行,那么反复调用函数将不是一个好方法比较函数调用的开销和调用std::cout所需的时间,你会发现这其实并不重要
bool agex = a.checkAgeMinor();
std::cout << "Age is" << agex << '\n';
if(!agex)
{
std::cout << "age less than 18" << '\n';
return 1;
} else {
std::cout << "Do something" << '\n';
return 0;
}