在C++中设置其值之前检查变量是否更好?

Ori*_*iol 7 c++ variables performance

如果我有一个布尔值和一些代码可能会改变它,然后我想将它设置为true,我应该检查它是否是false

例如:

bool b = false;
// Some code
// Here "b" can be true or false
if (cond) {
    b = true;
}
Run Code Online (Sandbox Code Playgroud)

VS

bool b = false;
// Some code
// Here `b` can be `true` or `false`
if (cond && !b){
    b = true;
}
Run Code Online (Sandbox Code Playgroud)

哪个更快?

注意:

我问这是因为以下Eratosthenes筛选的实现:http://bloc.gerardfarras.com/wp-content/uploads/2011/12/erastotenes.txt

if (( i % divisor == 0 ) && ( numsprimers[i] == 0 )) {
    numsprimers[i] = 1;
}
Run Code Online (Sandbox Code Playgroud)

(如果numsprimers[i]==1这意味着它i不是素数.如果它是0,它可以是素数或不是素数)

Ben*_*Ben 6

这是非常非常挑剔的,但一般来说,最好只改变这个值。

无论如何,检查和设置值的开销大致相同,那么为什么在某些情况下必须同时执行这两种操作呢?

现在,如果您想知道是否应该覆盖某些自定义类型(假设有 100000 个单词的列表),或者是否应该首先检查是否需要覆盖它(假设只需检查布尔值或时间戳),那么你应该首先检查,因为检查布尔值或时间戳的成本比将这么多单词写入内存要少得多。

当然,这完全取决于各种因素,例如您正在编辑的内存是否在缓存中、“检查”的成本有多大、您需要覆盖该值的频率与不需要覆盖该值的频率,当然还有内存的大小。

  • 我觉得很奇怪,这里没有人讨论多线程。据我所知(无论锁定如何),写入会使缓存行“脏”并强制所有其他核心重新加载它,而读取则不会。我想到的一个明显的问题是,向缓存写入相同的值是否会将其标记为脏并强制重新加载其他核心缓存,这在某些情况下肯定会使“仅覆盖”选项比检查和覆盖慢(因为检查会使其他核心的缓存保持完整)。 (3认同)