[解決済み] if(bool)とif(int)はどちらが速いか?
質問
<ブロッククオートどちらの値を使用するのが良いですか?ブール値trueと整数値1?
上記の話題から、私はいくつかの実験を
bool
と
int
で
if
という条件になっています。そこで、ちょっと興味本位でこんなプログラムを書いてみました。
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
.
関連
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] <は<=より速いのか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】変数やフィールドがvoid宣言されている