1

たとえば、以下に示すような関数があります

void caller()
{
    int flag = _getFlagFromConfig();
    //this is a flag, which according to the implementation
    //is supposed to have only two values, 0 and 1 (as of now)

    callee_1(flag);
    callee_2(1 == flag);
}

void callee_1(int flag)
{
    if (1 == flag)
    {
        //do operation X
    }
}

void callee_2(bool flag)
{
    if (flag)
    {
        //do operation X
    }
}

呼び出し先関数のどれがより良い実装になりますか?

私はこのリンクを通過しましたが、if 条件で比較のために bool を使用しても、パフォーマンスに大きな影響はないと確信しています。しかし、私の場合、フラグを整数として持っています。この場合、2 番目の呼び出し先に行く価値はありますか?

4

4 に答える 4

8

パフォーマンスの点では違いはありませんが、読みやすさの点では、値が 2 つしかない場合は a のbool方が理にかなっています。特に、フラグに のようなわかりやすい名前を付けた場合isFlagSet

于 2012-04-26T07:42:11.613 に答える
2

効率の点では、それらは同じでなければなりません。

ただし、それらは同じことをしないことに注意してください1。最初の関数以外のものを渡すことができ、パラメーター自体が false でなくても、条件は false と評価されます。追加の比較により、多少のオーバーヘッドが発生する可能性がありますが、おそらくそうではありません。

そこで、次のケースを想定してみましょう。

void callee_1(int flag)
{
    if (flag)
    {
        //do operation X
    }
}

void callee_2(bool flag)
{
    if (flag)
    {
        //do operation X
    }
}

この場合、技術的には、値がorboolに対して直接チェックされるのではなく、単語サイズの型に昇格されてから がチェックされるため、最初のバリアントの方が高速です。生成されるアセンブリは同じかもしれませんが、プロセッサは理論的にはオプションに対してより多くの作業を行います。truefalse0bool

于 2012-04-26T07:46:09.317 に答える
1

値または引数がブール値として使用されている場合は、それを宣言しboolます。パフォーマンスに違いが生じる可能性はほぼ 0 であり、boolドキュメントの使用は、読者とコンパイラの両方に対して意図を持っています。

また、int(既存のインターフェースのために)フラグとして使用されている がある場合:暗黙の変換を使用するか(インターフェースがそれをブール値として文書化する場合)、それを0(ではなく 1)と比較します。これは、ブール値として機能する方法の古い定義に準拠していますint(C++ が を持っていた時代より前bool)。

于 2012-04-26T07:45:50.293 に答える
0

boolとintの違いが異なる(最適化された)asmをもたらす1つのケースは、否定演算子( "!")です。

「!b」の場合、bがブール値の場合、コンパイラーは整数値が1または0のいずれかであると想定できるため、否定は単純な「bXOR1」になります。OTOH、bが整数の場合、データフロー分析を除いて、コンパイラは変数に任意の整数値が含まれている可能性があると想定する必要があります。したがって、否定を実装するには、次のようなコードを生成する必要があります。

(b != 0) ? 0: 1

そうは言っても、否定がパフォーマンスに不可欠な操作であるコードは非常にまれです。

于 2012-04-26T07:56:23.497 に答える