1. ホーム
  2. c++

[解決済み] if(bool)とif(int)はどちらが速いか?

2022-11-26 18:40:17

質問

<ブロッククオート

どちらの値を使用するのが良いですか?ブール値trueと整数値1?

上記の話題から、私はいくつかの実験を boolintif という条件になっています。そこで、ちょっと興味本位でこんなプログラムを書いてみました。

int f(int i) 
{
    if ( i ) return 99;   //if(int)
    else  return -99;
}
int g(bool b)
{
    if ( b ) return 99;   //if(bool)
    else  return -99;
}
int main(){}

g++ intbool.cpp -S は、各関数に対して以下のようなasmコードを生成します。

  • に対するasmコード f(int)

    __Z1fi:
       LFB0:
             pushl  %ebp
       LCFI0:
              movl  %esp, %ebp
       LCFI1:
              cmpl  $0, 8(%ebp)
              je    L2
              movl  $99, %eax
              jmp   L3
       L2:
              movl  $-99, %eax
       L3:
              leave
       LCFI2:
              ret
    
    
  • のためのasmコード g(bool)

    __Z1gb:
       LFB1:
              pushl %ebp
       LCFI3:
              movl  %esp, %ebp
       LCFI4:
              subl  $4, %esp
       LCFI5:
              movl  8(%ebp), %eax
              movb  %al, -4(%ebp)
              cmpb  $0, -4(%ebp)
              je    L5
              movl  $99, %eax
              jmp   L6
       L5:
              movl  $-99, %eax
       L6:
              leave
       LCFI6:
              ret
    
    

意外と g(bool) はより多くの asm の命令を生成します! ということでしょうか? if(bool) よりも少し遅いということでしょうか。 if(int) ? 以前は bool は、特に次のような条件文の中で使われるように設計されています。 if のような条件文に使われることを想定しているため、私は g(bool) はより少ない asm 命令を生成し、それによって g(bool) をより効率的かつ高速にします。

EDITです。

今のところ、最適化フラグは使っていません。しかし、それがない場合でも、なぜ、より多くのasmが g(bool) は、私が合理的な答えを探している質問です。また、私は -O2 の最適化フラグは全く同じasmを生成します。 しかし、それは質問ではありません。質問は、私が尋ねたものです。


どのように解決するのですか?

私には理解できます。あなたのコンパイラはどうやら bool を 8 ビット値として定義し、システム ABI では、小さな (< 32 ビット) 整数引数を呼び出しスタックにプッシュする際に、32 ビットに "promote" するよう要求しています。そのため bool と比較するために、コンパイラは g が受け取る 32 ビット引数の最下位バイトを分離するコードを生成し、そのコードと cmpb . 最初の例では int 引数はスタックにプッシュされた 32 ビット全体を使用するので、単純に全体と比較して cmpl .