2012-04-26 4 views
1

セイ関数に "int"または "bool"の形式でフラグを渡すと、パフォーマンスが向上しますか?

より高度な実装になります呼び出し関数の
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 
    } 
} 

の下に表示のように、私は機能を持っていますか?

私はこれを経験しましたlinkとif-conditionでの比較のためにboolを取ることでパフォーマンスの影響はあまりないと確信しています。しかし私の場合、私は整数としてフラグを持っています。この場合、2番目の被災者に行く価値はありますか?

+2

より論理的です。性能に違いはありません。 – Naveen

+0

もし 'value == variable'が' == 'の代わりに' = 'を書くのを助けることができたとしても、最近は少しプロフェッショナルであると考えられます。ヨーダの比較、彼らはあります。もう必要ではありません。可読性が低下します。 – Griwes

+0

典型的なプラットフォームでは、 'if(1 == flag)'の代わりに 'if(flag!= 0)'(または単に 'if(flag)')を使用すると、生成されるコードは 'bool' 。コンパイラはフラグのための唯一の正当な値である '1'と' 0'を知ることができません。 –

答えて

8

パフォーマンス上の違いはありませんが、2つの値しかない場合は可読性の面ではboolが理にかかります。特に、あなたのフラグをisFlagSetのような賢明な名前にしてください。

+0

ほとんどのプラットフォームで 'sizeof(bool)= 1'と書かれているように、私はこれまでにこのようなチェックをしていましたが、むしろ' int'(単なるdwordであることが保証されている) – Griwes

+0

boolがintとして格納されているとはどういう意味ですか?いいえ、ちがいます。 –

+0

intとcharと混同しました! – Nick

1

値または引数がブール値として使用されている場合は、boolと宣言します。 パフォーマンスに差が出る確率はほぼ0、 で、boolを使用すると、読者にも、コンパイラでも になります。また

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

2

効率の面では、同じである必要があります。

ただし、同じことをしないことに注意してください。最初の関数に1以外のものを渡すことができ、パラメータ自体が偽でなくても条件はfalseと評価されます。余分な比較アカウント一部オーバーヘッド、おそらくないです。 bool値はサイズの単語trueまたはfalseに直接確認し、それに昇格されていないので、技術的には第一の変形は、より速くなり

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

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

この場合:

はそれでは、次のような場合を想定してみましょうタイプを入力し、0を確認してください。生成されるアセンブリは同じかもしれませんが、プロセッサは理論的にはboolオプションでより多くの作業を行います。

+0

でも、私もブール値が昇進してチェックされているという印象を受けました。それがこの質問を投稿する理由でした。しかし、回答のほとんどは、両方が同じであることを伝えています。今私は混乱している:( – bibbsey

+0

@SubithPremdasこれを参照してくださいhttp://stackoverflow.com/questions/5764956/which-is-faster-if-bool-or-ifint –

0

boolとintの違いが異なる(最適化された)asmの結果が否定演算子( "!")である場合。

"b!"の場合、bがboolの場合、コンパイラは整数値が1または0のいずれかであると見なすことができるため、否定は単純な "b XOR 1"になります。 bは整数、コンパイラ、データフロー解析を禁止である場合OTOH、変数は任意の整数値を含むことができ、従って、それは言われているよう

(b != 0) ? 0: 1 

としてコードを生成しなければならない否定を実装することを想定しなければなりません、否定がパフォーマンスクリティカルな操作であるコードは非常にまれですが、私は確信しています。

関連する問題