スピード:
- 関数を呼び出すとは、スタックにプッシュしてからジャンプし、スタックに再度格納してから、もう一度ジャンプすることを意味します。関数にパラメーターを使用する場合、通常はさらにいくつかのプッシュがあります。
ループについて考えてみましょう。
for...
func1
ループ内では、これらすべてのプッシュとジャンプが要因になる可能性があります。
これは、C99でのインライン関数の表示とその前の非公式で大部分が解決されましたが、以前に作成された、または互換性を念頭に置いて作成されたコードの中には、その理由で長いものがあった可能性があります。
また、インラインにはフローがあり、一部はインライン関数リンクで説明されています。
編集:
関数の呼び出しによってプログラムが遅くなる例として、次のようにします。
4 static void
5 do_printf()
6 {
7 printf("hi");
8 }
9 int
10 main()
11 {
12 int i=0;
13 for(i=0;i<1000;++i)
14 do_printf();
15 }
これにより、(GCC 4.2.4)が生成されます。
.
.
jmp .L4
.L5:
call do_printf
addl $1, -8(%ebp)
.L4:
cmpl $999, -8(%ebp)
jle .L5
.
.
do_printf:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $.LC0, (%esp)
call printf
leave
ret
に対して:
int
main()
{
int i=0;
for(i=0;i<1000;++i)
printf("hi");
}
または反対:
4 static inline void __attribute__((always_inline)) //This is GCC specific!
5 do_printf()
6 {
7 printf("hi");
8 }
両方とも生成します(GCC 4.2.4):
jmp .L2
.L3:
movl $.LC0, (%esp)
call printf
addl $1, -8(%ebp)
.L2:
cmpl $999, -8(%ebp)
jle .L3
どちらが速いですか。