c言語inline関数の使用

3394 ワード

c言語inline関数の使用 
転載元:http://blog.chinaunix.net/uid-21843265-id-3056446.html
大学は教科書でinline関数を勉強したことがあります。inline関数として定義された後、関数呼び出しの費用を省きます。直接コードを組み込んで、関数コールの代わりに効率を高めます。仕事の後でプロジェクトの中でもとても少なくinlineを使って関数を定義しにきて、最近googleのgoogle c++style gderを研究して、発見の前に自分のinline関数に対する認識はあまりにも浅くて、ここで総括を学びます。1、inline関数は10行のコードを超えないでください。循環、switch、if文2、cファイルで定義されているinline関数は他のcファイルでは直接使用できません。googleはinline関数を*-inl.hヘッダファイルに定義することをオススメします。3、過度にinline関数の定義を使用しないでください。特に大関数にとって上の3点はどのように正しいinline関数を使用するかを説明しています。以前はinlineに対して完全な理解がなく、inlineを使用する方法は正しくないです。性能の低下があるかもしれません。F 14(gccバージョン4.5.1.20100924(Red Hat 4.5.1-4)(GCC)で実験を行いました。1、inline関数が10行を超え、サイクル、switch文を含めてgccでinline語義を実行し、inline関数をmain関数にコンパイルしました。
 1 //gcc n.c -O2 -S 
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 //inline int inc_inline(volatile int *j);
 6 inline int inc_inline(volatile int *j)
 7 {
 8     for (;*j < 100; (*j)++)
 9     {
10         *j += 2;
11         (*j)++;
12     }
13     switch (*j)
14     {
15     case 1:
16         (*j)++;
17         break;
18     case 2:
19         (*j)++;
20         break;
21     default:
22         break;
23     }
24     
25     return (*j)++;
26 }
27 
28 
29 int main(int argc, char *argv[])
30 {
31     volatile int i = 0;
32     
33     inc_inline(&i);
34 
35     printf("i;%d
", i); 36 37 return 0; 38 }
2、inline関数の定義を別のcファイルに入れたら、main関数ファイルでこの関数を宣言します。inline関数は有効ではありません。gccでコンパイルしたコンパイルはコールを使って正常な関数コールを行います。gcc n.c-O 2-S 3、inline関数を使いすぎると、プログラムファイルが大きくなり、性能が低下します。プログラムファイルが大きくなるのは当然ですが、なぜ性能が下がるのでしょうか?使い方が正しくないと性能が向上しないので、逆に低下します。今のCPUにはcacheがあります。コンパクトなコードはchacheに保存される時間が長く、cacheに命中する機会がもっと高いです。あるA関数がinlineとして定義されておらず、他の多くの関数によって呼び出された場合、そのA関数は長い間caheに保存される可能性があります。このようにCPUのコードの実行速度は多くなります。A関数がinline関数として定義されている場合、コードはそれぞれの呼び出し関数に分散され、このように指定されたたびに命中しないとメモリに行ってコードをcacheにコピーして実行します。より深いレベルの理解は、関数全体をコンパイルしたコンパイルコードの関数呼び出しのコンテキスト切り替えが多くの時間を占める場合、この関数をinline関数として定義することを考慮することができる。