C LANGUAGE TECHNOLOGY

【C言語】inline関数指示子の使い方と実例

悩んでいる人

C言語のinline関数指示子の使い方と実例を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity/Vyper,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

inline関数指示子

inline関数指示子は,C言語のC99規格から採用されたコンパイラに対して特定の関数をインライン展開するよう指示するものです.

つまり,コンパイラに対して,その関数を呼び出している全ての箇所に関数の実体を挿入するよう指示します.

inlineにより関数を呼び出す処理が不要になるため,処理時間が短くなるメリットがありますが,コードサイズが大きくなるデメリットがあります.

inlineはマクロ関数でも代用できますが,マクロの副作用により,想定と結果が異なる現象が発生する可能性があります.

なので,マクロ関数ではなくC言語の機能であるinlineを利用することが好ましいです.

マクロを知りたいあなたはこちらからどうぞ.

C言語 マクロ
【C言語】プリプロセッサ(マクロ)とは

こういった悩みにお答えします. こういった私から学べます. 目次1 C言語のプリプロセッサ(マクロ)とは2 #include:ファイルの取り込み3 #define:マクロ置換3.1 記号定数マクロ3. ...

続きを見る

inline関数指示子の注意点として,inlineを関数に指示した場合でも,コンパイラの最適化レベルを上げないとインライン展開されないことがあります.

GCC/Clangでは最適化オプションを-O2以上に設定する方が無難です.

また,inlineを指示する関数が多すぎる場合は,インライン展開が失敗して通常の関数呼び出しになる可能性があります.

なので,本当に必要な関数のみinlineを指示した方が無難です.

実際に関数がインライン展開できたかどうか確認したい場合は,アセンブラを読みましょう!

GCC/Clangでは,inlineキーワードの前にstaticを入れないとコンパイルが成功しないので注意して下さい.

なので,「static inline」とセットで使うことを覚えましょう!

参考までに,G++/Clang++/Visual StudioはC++言語のコンパイラなので,コンパイルが成功します.

C言語のコンパイラ固有の現象のようですね...

inlineの使い方

inlineの使い方は以下になります.

square関数の定義の前に「static inline」とインライン展開を指示していることがわかります.

実行結果は以下になります.

inline.cのアセンブラの出力結果は以下になります.

以下の58行目でmain関数がsquare関数(6~20行目)を呼び出しているので,インライン展開されていないことがわかります.

GCCに最適化オプション-O2をつけてコンパイルして,アセンブラを出力します.

上記の結果と比較すると,square関数がインライン展開されてmain関数に挿入されていることがわかります.

inlineのLinuxカーネルにおける実例

inlineのLinuxカーネルにおける実例を紹介します.

Linuxカーネルでは,inlineは__always_inlineマクロとして利用されています.

__always_inlineマクロは,GCC/Clangの拡張機能を利用した「inline __attribute__((__always_inline__))」として定義されています.

include/linux/spinlock.hにあるspinlock_check関数では,「static __always_inline」という形で利用されてています.

スピンロック処理はLinuxカーネルでよく利用されるので,高速化したいからですね.

Linuxカーネルを学びたいあなたはこちらからどうぞ.

Linuxカーネル
元東大教員から学ぶLinuxカーネル

こういった私から学べます. Linuxカーネルとは,C言語で開発されたオープンソースのOSです. Linuxカーネルは主に以下のコンピュータで広く利用されています. スーパーコンピュータ サーバ An ...

続きを見る

まとめ

C言語のinline関数指示子と,その使い方を紹介しました.

また,inlineのLinuxカーネルにおける実例を解説しました.

同じ関数指示子の_Noreturnを知りたいあなたはこちらからどうぞ.

C言語 _Noreturn
【C言語】_Noreturn関数指示子の使い方と実例

こういった悩みにお答えします. こういった私から学べます. 目次1 _Noreturn2 _Noreturnの使い方3 _NoreturnのLinuxカーネルにおける実例4 まとめ _Noreturn ...

続きを見る

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , ,