【发布时间】:2017-02-06 10:22:36
【问题描述】:
我想知道连接布尔值的方法。
我有时需要得到一个标志,对象列表中的至少一个对象是否具有特定的值/状态/被聚焦等。
我要做的是:
bool bHasState( false );
for ( auto o : MyObjectList )
{
bHasState |= ( o->state() == SOME_STATE );
}
我的一些同事总是将其替换为
bHasState = bHasState || ( o->state() == SOME_STATE );
这只是句法上的差异,还是我的方式错误、危险或缓慢?
【问题讨论】:
-
我会使用
if ( o->state() == SOME_STATE ) bHasState = true;,但无论哪种方式都可以。 -
Bo 的例子肯定更易读,更容易维护。
-
是的,但是当我有时会编写实时关键代码时,我会问自己,在循环中使用 if 语句是否会更慢。
-
如果时间紧迫,我怀疑
for ( auto o : MyObjectList )你想到处复制。 -
您的方式不使用短路运算符,因此,如果
o->state()必须执行复杂的计算(我对此表示怀疑)或获取一些互斥锁(肯定更有可能)||版本可能会有更好的性能(IOW,您必须平衡分支的成本与实际计算state()的成本)。||和if版本将基本相同(都有一个分支)。