【发布时间】:2019-11-06 15:13:08
【问题描述】:
我正在检查循环内的一个条件,如果它成立,就做点什么。
for (i = 0; i < n; i++)
{
// do lots of work here
.
.
.
if (constant_condition)
do_something(n);
}
条件独立于n,所以每次都检查一下感觉是多余的。我可以这样做:
if (constant_condition)
for (i = 0; i < n; i++)
{
// do lots of work here
.
.
.
do_something(n);
}
else
for (i = 0; i < n; i++)
{
// do lots of work here
.
.
.
}
这个新代码效率更高,但我不得不在我的程序中复制粘贴相同的代码。有没有不重复相同代码块的有效方法?
编辑:条件在编译时未知,但会在运行时给出,不会改变。
【问题讨论】:
-
只保留条件。如果它很复杂(不仅仅是测试变量),请将条件存储到循环前的
bool变量中。分支预测将消除条件的大部分(如果不是全部)开销。不要重复自己(“干”)。 -
为
// do lots of work here做一个函数,然后你就不用重复了。 -
当你说你有一个
constant_condition时,你说的是在编译时已知的东西,还是在运行时不会改变的东西?也就是说,如果条件永远不会改变,分支预测器将很快学会这一点,并且不会真正花费您任何费用。 -
为什么大家都投反对票?只是想学习如何编写干净的代码。如果您有改进问题的建议,请告诉我。
-
如何最好地写这个主要是基于意见。如果您担心性能,那么您最好停止担心并改为编写可读性并测量正在运行的代码而不是事先推测。话虽这么说,在循环之前放一个
const bool constant_condition = ...,然后在循环内使用它
标签: c++ for-loop coding-style conditional-statements