わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

bracketとstarの比較

Cの勘違い - わさっき

これらが間違いであることを検証するコードを書いてみました.

/* bracket-star.c */
#include <stdio.h>

int main(void)
{
  double a[10];

#ifdef STAR
  a[5] = 1.23;
#else
  *(a + 5) = 1.23;
#endif

  printf("a[5] = %g\n", a[5]);

  return 0;
}

とりあえず動作確認.

$ gcc -o bracket-star bracket-star.c && ./bracket-star
a[5] = 1.23

$ gcc -DSTAR -o bracket-star bracket-star.c && ./bracket-star
a[5] = 1.23

処理時間を比較する代わりに,「[ ]演算子でも*演算子でも,生成する機械語コードが同じになる」という仮説を立て,これが正しいことを確認することで,処理時間は変わらないことを示すことにしました.
2種類の方法で作った実行ファイルをmd5sumで比べればいいや,と思ったら,Cygwinでは毎回,実行ファイルのハッシュ値が変わることが分かりました.
代わりに,.sファイルで比較します.

$ gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc -S bracket-star.c && md5sum bracket-star.s 
ac0993a1a559afde7617765d639034cc *bracket-star.s

$ gcc -S -DSTAR bracket-star.c && md5sum bracket-star.s
ac0993a1a559afde7617765d639034cc *bracket-star.s

「[ ]演算子でも*演算子でも,生成する機械語コードが同じになる」であることが実証できました.よしよし.
と思って,Linux環境で試すと,大失敗.

$ gcc --version
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc -S -o bracket.s bracket-star.c && md5sum bracket.s
4509ca22cf2e683eba08d9213aa028af  bracket.s

$ gcc -S -DSTAR -o star.s bracket-star.c && md5sum star.s
4659c3816a95c09a26b6f48f8499043f  star.s

$ diff bracket.s star.s
20,21d19
<       leal    -88(%ebp), %eax
<       addl    $40, %eax
23c21
<       fstpl   (%eax)
---
>       fstpl   -48(%ebp)

ええっと,これは,*演算子を使うほうが,処理時間が短くなることを示唆しているのでは….
驚きの結論でした.