我感兴趣的是,for
循环测试表达式的哪些形式更正确(从性能和良好代码实践的角度来看):
for(i = 0; i < size - 1; i++) {
do something
}
或
int decreased_size = size - 1;
for(i = 0; i < decreased_size; i++) {
do something
}
第一个示例中每次都计算测试表达式size - 1
,还是编译器将其优化为常量值,因此无需创建其他变量decreased_size
?
我一直在创建一个额外的变量,但是现在,看看Codeforces上的其他变量,我怀疑 - 它是否有意义?
编译器:GCC版本5.4.0 20160609
答案 0 :(得分:2)
没有人比其他人更有意义。实际上,通过优化,它会生成相同的代码:https://godbolt.org/g/vzVJVF
其次,在大多数情况下,size-1
所消耗的时间与循环中的动作消耗的时间相比可忽略不计,因此优化此部分对系统的影响非常小。
总之,只在需要时进行优化(因此您会发现存在时间/内存问题)。在每一天,都喜欢一个易读且易于理解的代码。
答案 1 :(得分:0)
我同意@ Garf365。如果您同时查看https://www.tutorialspoint.com/assembly_programming/assembly_loops.htm,您会看到循环计数在循环开始之前加载到寄存器中,因此必须计算size-1
并仅加载一次。