• ベストアンサー

手続きのインライン展開 基準

コンパイラ型言語における手続きのインライン展開についてです。 例えばC++の場合、inline指定子をつけるなどしてインライン展開を促しますが, 長い手続きの場合はインライン展開されないと記憶しています。 お尋ねしたいことは2つあります。 1つ。1箇所でしか呼び出されない手続きの場合、どんなに長くても、インライン展開したほうがより最適なプログラムになるのではないか? 2つ。1箇所でしか呼び出されない手続きの場合、最適化モードでコンパイルするなりインライン展開指定するなりすれば、インライン展開は行なわれるか? 暇な時にでも、どなたか教えていただけたら幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

C++のインライン展開については分かりませんが、Cの場合で、かつ私が使っているPGIのコンパイラの場合について書きます。 Intelコンパイラも多分同じようなことをやっています。gccは最適化のメッセージをあまり出さないので分かりませんが、近いことをやっているはずです。 1) インライン展開は埋め込まれる場所にコードを書いたのとほぼ同じになります。CALLが減るだけで普通は誤差内です。 このあたりも参考に http://d.hatena.ne.jp/wocota/20090219/1235058524 インライン展開の一番効果があるのは、インライン展開によりベクトル化(インテルCPUの場合はSSEを使う)ができる場合です。 関数呼び出しをそのままコンパイルするとベクトル化が原理的にできませんが、インライン展開することによりベクトル化が可能な場合があります。その時には効果を発揮します。 ベクトル化が行われるところは、普通は一番内側のループでそこから関数呼び出しが行われているときにインラインの効果のある場合があります。 CPUのベクトル化は結構条件が厳しく、複雑な演算ではできないことが多いので単純な関数でないと難しいのが現状です。 (GPUの方が条件は緩い) このあたりのことは書くとキリが無いので、聞きたいことがあれば書き込んでください。

plot02
質問者

お礼

回答ありがとうございます。 自分が知りたいことは十分知ることができました。 インライン展開の効果が一番現れるのはどんなときか、という点まで教えていただき勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.1

こういう事はコンパイラの設計に依存するので特定のコンパイラの説明書を確認するしかありません。C++の文法の範囲外の事と思います。

plot02
質問者

お礼

了解です。 それではgccの場合について知りたいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • インライン展開でコンパイラが何をやっているのか知りたいです

    インライン展開すると、関数の呼び出しオーバーヘッドが小さくなることはわかるのですが、インライン展開した場合としていない場合と、なぜ関数呼び出しのオーバーヘッドがなくなるのかアセンブルレベルでの違いがよくわからないです。 関数をインライン展開した場合、コンパイラはどのようにコンパイルするのか、そしてその関数実行時の振る舞いがインライン展開なしの場合とどう違うのか、わからないので教えていただけませんか? 以上、よろしくお願いします。

  • 再帰関数のインライン展開

    再帰関数のインライン展開は出来るのでしょうか? もし、出来るようならアセンブラではどのように表現されているんですか? C以外の言語でも、再帰関数のインライン展開が出来るプログラム言語があれば教えてください。

  • インライン関数

    インライン関数として認識されなくても、通常の関数として実行されるのなら、プログラムする際にはすべての関数にinlineと書けばいいと思います。 インライン関数を使えば実行速度が上がる。それなら何故コンパイラ側で通常の関数すべてをインライン関数として認識しないのかがわかりません。inlineと書く手間が省けるので。 lnline関数として認識しようとしたができず、通常の関数として実行する時は、通常の関数を普通に実行するときよりも実行速度が遅くなるのでしょうか?もし、遅くならないのならすべての関数をinline関数として書けばいいと思います。どうなんでしょうか?お願いします。

  • 初心者です。

    私は最近になって、c言語をゼロから勉強したいと思い、Borlandのページから、コンパイラーや、デバッガーを落としてきたのですが、ナントカ.c、のプログラムを、どうコンパイラーを使ってコンパイルするかわかりません。Ms-dosプロンプトからやるのか、さっぱりわかりません。どなたか教えていただければ、幸いです。よろしくお願いします。

  • GNUコンパイラとIntelコンパイラの違いについて

    今回fortranとC言語で書かれたWindows用プログラムをLinux用に移植することになりました。GNUのコンパイラを使用し無事コンパイルできたので実行したのですが"Segmentation fault"となりうまく実行できませんでした。そこで試しにIntelのコンパイラを使用しコンパイルしてみたところGNUのときとは違い"Segmentation fault"とは出ず、プログラム内のエラーチェックに引っかかり止ってしまいました。同じソースコードにもかかわらず止まる箇所が異なります。 今まで考えたことがなかったのですがGNUとIntelのコンパイラの違いはなんなのでしょうか?また、この二つ以外にいいコンパイラはあるのでしょうか?

  • コンパイルの実行の仕方

    初めてプログラミング言語を授業でとったのですが、 コンパイルの【実行】の仕方がわかりません。 まず、コマンドプロンプトを開くまではわかったのですが、 学校での説明に 「javaのコンパイラはjavacであるので、以下のように指定する。 javac <ソースファイル名> 」 と書いてありました。 コンパイラというのは上記の場合、コマンドプロンプトに 「C:\>javac *****.java」を入力すればコンパイルしたということになるのでしょうか? 「指定する」とかいてあっても指定の仕方すらわからないのです。 コンパイルを検索してもなかなかコンパイルをする意味がよくわからないので、よろしければ教えてください。

  • C言語での質問です

    C言語を始めて、2ヶ月くらいです。コンパイラは、Borlandc++で、エディタは、bcpadに付いていたものを使っています。 「サンプル通り作成したプログラムがコンパイルエラーになり」 一つ一つ確認しても、間違っている箇所が見つかりません。一人で解決できないとき、皆さんはどのようにして解決していますか。

  • gccコンパイラー

    今、gccでコンパイルするc言語のコンパイラーを探しています。 フリーでダウンロードできるいいコンパイラーはないでしょうか。 お勧めなどがありましたら教えてほしいです。 あと、C言語ではgccやbcc等のコンパイラーで プログラムソースの書き方容が変わったりするものなのでしょうか? 一応、ボーランド?のコンパイラーは持ってます。 ただ、今度OJTでUNIX環境のc言語開発の現場に行く事になり gccでコンパイルするもので勉強しとくようにいわれています。 宜しくお願いします。

  • CとJavaはどのくらいスピードが違うの?

    BorlandのJBuilderなど、Javaもネイティブコードコンパイラがありますよね。質問ですが、 (1) UNIXで動くJavaのネイティブコードコンパイラで優秀なものはあるのでしょうか。 (2) C言語でコンパイルしたプログラムとJavaでネイティブコードコンパイルしたプログラムは、どのくらい速度に差があるのでしょうか? たとえば、Visual Basicも最近のバージョンはネイティブコードコンパイルができますが、C言語で作った同じ論理構造のプログラムに比べて、やはり、かなり実行速度が劣ります。

  • FedraCore4でのC言語

    簡単なCのプログラムをテストしようとしたのですが、コンパイラが見つかりません。 パッケージを全部インストールしていない状況でC言語のプログラムををコンパイルするにはどうすればよいのでしょうか?