ふと気になって

lang:c
if (condition) {
  var1 = foo;
  var2 = hoge;
} else {
  var1 = bar;
  var2 = huga;
}

lang:c
var1 = bar;
var2 = huga;
if (condition) {
  var1 = foo;
  var2 = hoge;
}

ってな感じのコードをCで書いていろいろ比べてみた.

手元のgcc 4.0.2(FC4/kernel 2.6.14/Pen4 2.8GHz)で-O2でコンパイルして,”objdump -d”でみると後者のほうが命令数が減って,多少高速化されてるっぽい.

”?:“でもいけるのだけど実際には,前者のと変わらないうえ,条件の評価の結果用の変数が要る(もしくは,条件の評価が複数回起こる)のであまり意味は無い.

検証用に,全ソース.

#####src1.c

lang:c
#include <stdio.h>
int main(int argc, char* argv[])
{
  char *arg1, *arg2;
  if (argc == 2) {
    arg1 = argv[0];
    arg2 = argv[1];
  } else {
    arg1 = argv[1];
    arg2 = argv[0];
  }
  printf(&quot;%s,%s\n&quot;, arg1, arg2);
  return 0;
}

#####src2.c

lang:c
#include <stdio.h>
int main(int argc, char* argv[])
{
  char *arg1, *arg2;
  arg1 = argv[1];
  arg1 = argv[0];
  if (argc == 2) {
    arg1 = argv[0];
    arg2 = argv[1];
  }
  printf(&quot;%s,%s\n&quot;, arg1, arg2);
  return 0;
}

#####src3.c

lang:c
#include <stdio.h>
int main(int argc, char* argv[])
{
  char *arg1, *arg2;
  arg1 = (argc == 2) ? argv[0] : argv[1];
  arg2 = (argc == 2) ? argv[1] : argv[0];
  printf(&quot;%s,%s\n&quot;, arg1, arg2);
  return 0;
}