- ベストアンサー
手続きのインライン展開 基準
コンパイラ型言語における手続きのインライン展開についてです。 例えばC++の場合、inline指定子をつけるなどしてインライン展開を促しますが, 長い手続きの場合はインライン展開されないと記憶しています。 お尋ねしたいことは2つあります。 1つ。1箇所でしか呼び出されない手続きの場合、どんなに長くても、インライン展開したほうがより最適なプログラムになるのではないか? 2つ。1箇所でしか呼び出されない手続きの場合、最適化モードでコンパイルするなりインライン展開指定するなりすれば、インライン展開は行なわれるか? 暇な時にでも、どなたか教えていただけたら幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
C++のインライン展開については分かりませんが、Cの場合で、かつ私が使っているPGIのコンパイラの場合について書きます。 Intelコンパイラも多分同じようなことをやっています。gccは最適化のメッセージをあまり出さないので分かりませんが、近いことをやっているはずです。 1) インライン展開は埋め込まれる場所にコードを書いたのとほぼ同じになります。CALLが減るだけで普通は誤差内です。 このあたりも参考に http://d.hatena.ne.jp/wocota/20090219/1235058524 インライン展開の一番効果があるのは、インライン展開によりベクトル化(インテルCPUの場合はSSEを使う)ができる場合です。 関数呼び出しをそのままコンパイルするとベクトル化が原理的にできませんが、インライン展開することによりベクトル化が可能な場合があります。その時には効果を発揮します。 ベクトル化が行われるところは、普通は一番内側のループでそこから関数呼び出しが行われているときにインラインの効果のある場合があります。 CPUのベクトル化は結構条件が厳しく、複雑な演算ではできないことが多いので単純な関数でないと難しいのが現状です。 (GPUの方が条件は緩い) このあたりのことは書くとキリが無いので、聞きたいことがあれば書き込んでください。
その他の回答 (1)
- kngj1740
- ベストアンサー率18% (197/1052)
こういう事はコンパイラの設計に依存するので特定のコンパイラの説明書を確認するしかありません。C++の文法の範囲外の事と思います。
お礼
了解です。 それではgccの場合について知りたいです。
お礼
回答ありがとうございます。 自分が知りたいことは十分知ることができました。 インライン展開の効果が一番現れるのはどんなときか、という点まで教えていただき勉強になりました。