我在C ++中使用for循环,我想要一个" if"它在其内部的子句在下一次迭代(为了性能)中消失后,它将值检查为true一次。这可能用C ++或任何其他语言吗?
答案 0 :(得分:4)
动态更改代码没有神奇之处。如果if
条件执行起来很便宜,则在循环中执行if
子句可能不是非常昂贵。
如果要评估的条件很昂贵,您可能希望使用额外的布尔变量保护:
bool mustCheck = true;
size_t const n = ...; // number of iterations
for (size_t i = 0; i < n; ++i) {
if (mustCheck && theExpensiveCheck(...)) {
mustCheck = false; // turn off the check now
....
}
...
}
如果目标是仅对第一次迭代执行检查,则可以测试循环索引是否为0
:
for (size_t i = 0; i < n; ++i) {
if (i == 0 && theExpensiveCheck(...)) {
....
}
...
}
在循环中没有if
的另一个选项是完全拉出if
,如果循环至少有一次迭代,则在循环之前执行它:
size_t const n = ...; // number of iterations
if (n > 0) {
// do check and execute loop body for first item
if (theExpensiveCheck()) {
....
}
}
// start regular loop, starting at index 1
for (size_t i = 1; i < n; ++i) {
// execute loop body for other items
...
}
上述修改会给代码增加额外的复杂性(以及潜在的错误)。如果不清楚循环或if
条件是否存在执行问题,我建议不要执行任何这些修改。通常情况下,应用上述修改不会带来显着的性能提升,但显然取决于if
条件。
现在编译器还提供了几种强大的循环优化技术,因此您应该确保在编译时启用了所有这些优化。
答案 1 :(得分:1)
这在C ++中是不可能的。一旦编译完成,那就是它。但是,你不应该担心一次检查一个值。性能影响微不足道。
我想如果值检查非常复杂(即不仅仅是简单检查它是T还是F),你可以添加某种标志来先检查,然后跳过其余的检查,如果它是真的。这显然需要自己的检查/分配,很可能不值得。