2017/06/10

[c/c++]3項演算子とifはそこまで変わらない

判断して代入するだけ、という処理はしばしば書くと思う。

2択の場合、私は三項演算子を使うことが多い。
ただ、3項演算子で書くと1行が長くなりすぎることがあり、そういうときは改行したりする。

そういうとき、改行するくらいだったらif文で書けばよいんじゃないの?

という声がよぎるのだ。

やることは同じなので、結果として同じバイナリになるのだったら、その時の気分だったりコーディング規約で書けばよいのだけど、もし高速になる要素があるのだったら推していくのもありだろう。

gccで確認しよう。


int main(int argc, char *argv[])
{
    int vol;
    if (argc == 1) {
        vol = 2;
    } else {
        vol = 1;
    }
    printf("vol = %d\n", vol);
    return 0;
}


int main(int argc, char *argv[])
{
    int vol = (argc == 1) ? 2 : 1;
    printf("vol = %d\n", vol);
    return 0;
}


これといった特徴はないコードだ。
argcを使ったのは、なんとなく最適化されなさそうだと思っただけだ。

結果を先に言うと、Bash on Windowsのgcc(gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609)では、最適化あり(-O1以上)にすると同じになった。
最適化するのであれば、どっちでもよいと思う。
何らかの理由で最適化しないのであれば、三項演算子の方が短くなった。



最適化無し(-O0)でコンパイルした結果。
右がif、左が三項演算子。

image

1と比較して一致しないならL2にジャンプして1を代入するという処理は同じだが、ifは直接-4(%rbp)に突っ込んでるのに対し、三項演算子は%eaxに突っ込んだ後で-4(%rbp)に代入している。
三項演算子のそれぞれで処理してレジスタに入れて、それを代入させる、ということだから、うん、確かにそういう動きですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。