动态删除代码?

时间:2015-08-28 19:38:05

标签: c++ dynamic

我在C ++中使用for循环,我想要一个" if"它在其内部的子句在下一次迭代(为了性能)中消失后,它将值检查为true一次。这可能用C ++或任何其他语言吗?

2 个答案:

答案 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),你可以添加某种标志来先检查,然后跳过其余的检查,如果它是真的。这显然需要自己的检查/分配,很可能不值得。