2013年8月29日木曜日

インライン関数とは

インライン関数とは、その名の通り実行時にソースコードの関数呼び出し口に
展開される関数のことです。インライン関数のメリットは関数呼び出しにかかる
時間を節約できることです。

関数に inline をつけることで、コンパイル時に呼び出し箇所への関数定義が
できるだけ展開されるようになります。これがインライン関数です。
注意する点は、コンパイラは必ずインライン関数を呼び出し箇所に展開するわけでは
ないということです。(^_^;)

インライン関数例
inline int CalcAddNumber(int x, inb y)
{
    return x + y;
}
        :
int main(void)
{
    CalcAddNumber(5, 10);    //ここで上記のインライン関数が展開されます
        :
        :

インライン関数にすると、引数をコピーするなどの関数呼び出し時の処理が省略され
実行時間が早くなります。しかしその一方、プログラムのサイズが大きくなってしまうので
何でもかんでもインライン関数にすればよいというわけではありません。(ーー;)

では、ここでサンプルプログラムでちょっと時間計測をしてみましょうか
#include <iostream>
#include <stdio.h>
#include <sys/time.h>

using namespace std;

//CalcAddNumberのこの2行をコメントにするほうを切り替えて
//比較してみたいと思います 
inline int CalcAddNumber(int x, int y)
//int CalcAddNumber(int x, int y)
{
    return x + y;
}

int main(void)
{
    struct timeval start, end;

    gettimeofday(&start, NULL);
    int ans = CalcAddNumber(5, 10);
    gettimeofday(&end, NULL);

    cout << "answer is " << ans << endl;
    cout << "time = " << (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)*1e-6 << endl;
    printf("time = %f\n", (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)*1e-6);

    return 0;
}

インライン関数(inline int CalcAddNumber(int x, int y))の結果
# ./test
answer is 15
time = 4e-06
time = 0.000004

通常の関数(int CalcAddNumber(int x, int y))の結果
# ./test
answer is 15
time = 4e-06
time = 0.000004

うーん、見事に同じですね(^_^;)
処理が少し簡単すぎたようで、これでは比較できてないですね、残念。
次回もっといいネタを探して書くことにします(汗)


インライン関数を定義する場所
インライン関数の定義内容は、どのファイルからでも参照できるように
ヘッダファイル(*.h)に記載します。

インライン関数にすると良い関数
処理内容の少ない関数は、呼び出し箇所へ展開されてもプログラムサイズに
ほとんど影響しません。また、小さい関数の場合は、関数全体の処理に対して
呼び出し処理にかかる時間の割合のほうが大きくなるので効果的です。
小さい関数の場合は、インライン関数にするとかなり効果が期待できます^^

また、呼び出し回数の多い関数をインライン関数にするのも効果的です。
何度もループで呼び出されるような小さい関数をインライン関数にすることで、
実行時間の節約にもなります。

インライン関数をうまく使って、速いプログラムが作れるようになりたいものです(^^)


今日の名言
どんな職業につこうと、成功に向かう第一歩は、その職業に興味を持つことだ。
                              サー・ウィリアム・オスラー

強い信念によって強い人間が生まれる。そしていっそう人間を強くする。
                              ウォルター・バジョット

限りなく心を打ち込んでかかれる事柄であれば、人間は大抵のものに成功できる。
                              チャールズ・シュワップ

人間が臨終に際して、子孫に熱中する心を伝えることができれば、
無限の価値ある財産を残したことになる。
                              トーマス・A・エジゾン

何か1つ趣味を持たない限り、人間は真の幸福も安心も得られない。植物学、蝶や
カブトムシの採集、バラやチューリップ、スイセンの花作り、釣り、登山、骨董-その他
どんなものに興味を持とうと、その人の人生は素晴らしいものに変化する。趣味という
馬を乗りこなせる限り、何の趣味でもかまわない。
                              サー・ウィリアム・オスラー