|
なるほど。 ということは、私のビルトイン関数だからという理由はズレていました。 暗黙の宣言でも動作するってことですね。 よく分かってないのに変な返答をしてしまって申し訳ないです。
ついでですが、ビルトイン関数のことです。 以下の (1) と (2) のアセンブラコードはほぼ同じになりました (gcc 2.95.4 Debian/GNU Linux)。 ビルトイン関数を使わないと call sin します。
処理系固有な話になりますが、たとえば Linux の gcc では sin 関数など 最適化オプションを有効にすると math.h (から読まれるヘッダも含む) で インライン展開されるようになっています。
似たようなコードになるということは、gcc 内インラインアセンブラで記述 されているんでしょうね。
/* (1) math.hをインクルードしない */ int main(void) { extern int printf(const char*, ...); extern double sin(double); printf("%f\n", sin(5)); return 0; } /* (2) math.hをインクルードする */ #include <math.h> int main(void) { extern int printf(const char*, ...); printf("%f\n", sin(5)); return 0; }
% gcc -O -ffast-math -S hoge.c (-O と -ffast-math は最適化オプション。-S でアセンブリソースを出力) /* (1) */ main: pushl %ebp movl %esp,%ebp subl $8,%esp addl $-4,%esp fldl .LC0 fsin subl $8,%esp fstpl (%esp) pushl $.LC1 call printf xorl %eax,%eax leave ret
/* (2) */ main: pushl %ebp movl %esp,%ebp subl $8,%esp addl $-4,%esp fldl .LC33 #APP fsin #NO_APP subl $8,%esp fstpl (%esp) pushl $.LC34 call printf xorl %eax,%eax leave ret
※APP はアセンブラプリプロセサで、インラインアセンブラを使うと ※挿入されます (Borland C++ Builder の asm{} みたいなものです)。
|