C++:仅在未设置时设置bool值

ecb*_*die 8 c++ boolean variable-assignment compiler-optimization conditional-statements

我的C++应用程序中的代码通常会这样做:

bool myFlag = false;
while (/*some finite condition unrelated to myFlag*/) {
    if (...) {
        // statements, unrelated to myFlag
    } else {
        // set myFlag to true, perhaps only if it was false before?
    }
}
if (myFlag) {
    // Do something...
}
Run Code Online (Sandbox Code Playgroud)

我的问题与else我的代码声明有关.基本上,我的循环可以根据某个未满足的条件将myFlag的值从false设置为true.永远不会将旗帜从真假转为虚假.我想知道哪种语句在性能方面更有意义,并且可能由于编译器优化而导致此问题实际上不是问题.

myFlag = true;
Run Code Online (Sandbox Code Playgroud)

要么

if (!myFlag) myFlag = true;
Run Code Online (Sandbox Code Playgroud)

我通常会选择前者,因为它需要编写更少的代码.然而,我开始怀疑它可能涉及不必要的写入记忆,因此后者会阻止不必要的写作,如果myFlag已经是真的.但是,使用后者会花费更多时间,因为有一个条件语句,因此使用更多指令编译代码?

或许我过分思考这个......


更新1

只是澄清一下......后一种情况的目的是如果变量已经为真,则不写入内存.因此,只有在变量为false时才写入内存.

Jer*_*fin 11

你几乎肯定会更好地使用它myFlag = true;.

关于你可以希望的最好的东西if (!myFlag) myFlag = true;,编译器会注意到它if是无关紧要的并且优化它.特别是,if语句需要读取当前值myFlag.如果该值尚未存在于高速缓存中,则意味着在等待从存储器读取数据时指令将停止.

相比之下,如果您只是编写(没有先测试),则可以将值写入写入队列,然后可以立即执行更多指令.除非你读取myFlag的值,否则你不会得到一个停顿(并且假设它在写入后很快就会被读取,它可能仍然在缓存中,所以拖延将是最小的).