Inline

inline.png

インラインといったら、アイラインしか思いつきません。
アイラインと同じで、いつ、どこでも使えばいいってものではないんです。インラインは

関数呼び出しのオーバーヘッドを避けるときに使う。
#define のマクロよりインライン関数を使うといいらしい。

template<typename T>
inline void CALL_WITH_MAX(const T& _a,const T& _b){
f(a>b ? a:b);
}

グローバルなinlineはヘッダファイルだけに配置すべきである。

メンバ関数のインライン化

inlineというキーワードは要らない
(もちろん、inline キーワードを指定してもよい)
メンバ関数も、通常の関数同様にインライン関数として定義することができます
メンバ関数のインライン化の場合、通常はクラス内部で内容を定義してしまいます

class class-name {
    type member_f() {
        statements...;
    }
};

member_f() は、クラスの内部で宣言されているメンバ関数です

さらに、クラス内で定義したメンバ関数の場合は inline を指定しなくても
自動的にインライン化されます。

#include <iostream>
using namespace std;
 
class Kitty {
public:
    int func(int x) {
        return x + (int)(x * 0.05);
    }
} obj ;
 
int main() {
    cout << obj.func(100);
    return 0;
}

クラス内で定義された関数は、インライン化可能であれば自動的にインライン関数になり
インライン化できなかった場合、通常の関数として扱われます

インラインを使うべき時はいつなのか?

  • 処理がちっぽけな関数を、1フレームにつき数千回呼び出す必要がある場合

かつ、その関数の中でメンバ変数が使われていて、メンバ変数はpublicにしたくない場合

インライン関数のつまづきポイント

  • インラインを指定する関数はヘッダーファイルで定義すること
  • あまり長い関数をインライン化しようとすると、インライン化を拒否される場合がある(しかも何のメッセージもなしに!)
  • プラットフォームによっては、インライン関数の動作が違うことがある(コンパイラによってインラインに関するルールが異なる)

ちゃんとインライン化されたかどうか確認するためには?

  • 時間を測る。速度がUPしてたらインライン化されたということ
  • アセンブリコードを見る

インラインを使用するタイミング★

全部インライン化したらどうなる?

すべての関数が展開されるので、ソースコードが膨れ上がり、実行可能ファイルのサイズが膨れ上がります
それの何がいけないかって?
そうすると、

結果、プログラムのパフォーマンスが大きく低下します。
他にも

  • コンパイル時間が長くなる

インライン関数はcppではなく、.hに書かれるからです。

インライン関数の賢い取り入れ方

まず、なんでもそうですが、最初はロジックだけに集中してコードを開発すること。
この時は、正しく挙動することを重視して、まだ速度のことはあまり考えなくてもよいです。
そして、出来たら、次に速くなることろはないか、考えましょう。
時間がかかっている関数ランキングを出して観察してみましょう

最も頻繁に呼び出される関数の上位に小さな関数が入ってないかどうか?

きっと、内積の計算とかはこういう関数になるでしょうね。
そうやってインライン候補を挙げていきましょう。

インラインとマクロの違い

インライン マクロ
コンパイラによって展開される プリプロセッサによって展開される
型チェックが行われる 型チェックが行われない
デバッガでのステップ実行が出来る 出来ない
クラスの一部になれる なれない

なので、マクロの使い時は、コンパイラによてインライン化が拒否られた時かな?

サポートサイト Wikidot.com