ゲームプログラマーとして入社してから約1年が経ち、自分が学んだことを少しずつまとめていこうと思い立ったので記載。
本日はinline関数についての内容です。
言語はC++、環境はDirectX12を想定して記載しております。
Inline関数とは何か。
簡単に言うと関数呼び出しのオーバーヘッドを減らす最適化のための手段のことです。
類似しているものとしてマクロや関数が挙げられます。
記述形式
Inline関数は下記のように記述されます。
//例文
inline 戻り値の型 関数名 (引数)
{
return 引数;
}
マクロや関数との違い
関数とマクロは以下のように処理を行います。
関数 :関数本体へジャンプして処理する
マクロ:プリプロセッサが文字列の置き換えを行う。
一方で、Inline関数は
関数としての安全性を保持しながら、コンパイラによってインライン展開された際はマクロのように呼び出し元へ展開される(こともある)関数
となります。
先ほど挙げた関数やマクロとの違いであり、利点を箇条書きにするのなら、
- ジャンプではなく、関数本体を呼び出し元へ展開する。(ジャンプしなくて良い)
- コンパイラで処理が行われる。
- 文字列の置き換えではないためバグが起こりにくく安全。
などが挙げられます。
ただ、inlineは必ずしもインライン化されるわけではなく、
inline void Test()
{
for(int i=0;i<100000;i++)
{
}
}
といった後述するメリットの薄い処理の場合は展開しない場合もあるようです。
どういった場合で使用するのか。
前述の通り、Inline関数とは関数呼び出しのオーバーヘッドを減らす最適化のための手段ですので、
短く、頻繁に呼び出される処理をまとめる際に使う
という考えで良いです。
例文を挙げるのなら、以下のような処理。
inline float GetHp() const
{
return mHp;
}
逆に、ループ処理や関数本体が大きくなる場合に使用すると、
インライン展開した際、コードサイズが大きくなり、メリットが薄くなってしまうので、あまり良くないとのこと。
以上。
本記事は、業務や学習を通して理解した内容を、自分自身の整理も兼ねてまとめたものです。内容に改善点や補足などがありましたら、ご指摘いただけますと幸いです。
以下は私がこの件を記載するにあたって学んだ用語です。
-
オーバーヘッド
:本来やりたい処理以外に発生する余計な処理の総称 -
コンパイラ
:人間が書いたソースコードを機械語へ変換するプログラム -
プリプロセッサ
:コンパイル前に動作するコード変換や置き換えをしてくれる機能やソフトウェアのこと。