CC-RHでは,関数ごとのインライン展開ができます。ここでは,インライン展開の指定について説明します。
インライン展開とは,関数呼び出し部分に関数本体を展開することを言います。これにより,関数呼び出しによるオーバーヘッドが小さくなり,また,最適化の可能性が高められることから,実行速度向上を図ることができます。
ただし,インライン展開を行うと,オブジェクト・サイズは増大することになります。
インライン展開したい関数は,#pragma inlineで指定します。
関数名は,C言語記述の関数名を記述してください。たとえば,"void func1 ( ) { }"という関数であれば"func1"と指定します。また,関数名は“,”(カンマ)で区切って複数指定することができます。
#pragma inline func1, func2 void func1() {...} void func2() {...} void func(void) { func1(); /*インライン展開対象*/ func2(); /*インライン展開対象*/ } |
#pragma inline指定された関数をインライン展開するためには,最低限次の条件が必要となります。
ただし,CC-RHの内部処理の関係により,次の条件を満たしていてもインライン展開されない場合があります。
インライン展開を“する関数”と“される関数”,つまり,“関数呼び出し”と“関数定義”は“同一ファイル内”に存在しなければなりません。別のCソースに書かれてある関数をインライン展開することはできません。この場合,CC-RHはエラーも警告メッセージも出力せず,インライン展開指定を無視します。
pragma inlineが,関数定義よりも後ろに記述されていた場合,警告を出力してインライン展開指定を無視します。ただし,関数のプロトタイプ宣言との記述順序は問いません。次に例を示します。
インライン展開する関数の“呼び出し”と“定義”の間で“引数の数”が違う場合,インライン展開指定を無視します。
インライン展開する関数の“呼び出し”と“定義”の間で,“戻り値の型”や“引数の型”が異なる場合,インライン展開指定を無視します。ただし,引数の型が整数型(enumを含む),またはポインタ型でサイズが同じ場合は,インライン展開を行います。
引数が“可変個”の関数にインライン展開指定した場合,エラーも警告メッセージも出力せず,インライン展開指定を無視します。
自分自身を呼び出す“再帰関数”をインライン展開指定した場合,エラーも警告メッセージも出力せず,インライン展開指定を無視します。ただし,関数呼び出しが複数ネストし,そのネストした中に自分自身を呼び出すコードが存在した場合,インライン展開する場合があります。
展開対象関数のアドレスを介して呼び出しを行った場合,エラーも警告メッセージも出力せず,インライン展開指定を無視します。
-Oinline オプション使用時に特定関数のインライン展開を抑止したい場合,インライン展開を抑止したい関数を,#pragma noinlineで指定します。
#pragma inline_asm,#pragma inline,#pragma noinline,#pragma interrupt,
#pragma block_interrupt,#pragma stack_protector
#pragma inline_asm,#pragma inline,#pragma noinline,#pragma interrupt,