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