2011-12-19 10 views
1

最新のコンパイラが関数をインライン化するかどうかを評価するための一般的な規則はありますか?余分なスタックフレームの相対的なコストはどれくらいですか(私はそれが非常に小さいと知っていますが、一般的にそれを数量化する方法はありますか?コンパイラがインライン化できることを合理的に期待することはできますか?

私はまた、特に興味:コンパイラのインラインメソッドは、CPPに定義されていることができます

  • 私はいくつかのコンパイラがデバッグでもいくつかの最適化を実装していることを知っています(VSはデバッグでRVOを使用しますが、NRVOでは使用しません) - インライン化の状況はどうですか?私は、デバッグのための予想されるコールスタックを見ることができるように、それが無効であると思います。

私は現在、メモリトラッキングシステムを最適化しようとしています。特に、最適化を有効にしないで(デバッグ時に)適用します。

+0

...コンパイラに依存します...あなたが得る答えは非常に短時間で日付がつきます。 – dmckee

+0

@dmckeeコンパイラの最適化についてはあまりよく分かりませんので、RVO/NRVOを例として使用します。これらのコンパイラは現代のコンパイラに実装されており、すぐに時代遅れになることはありません。私は、類似の最適化がたくさんあると仮定します。また、新しいC++標準が10年に1回しか出現しないときに、非常に短時間で回答が古くなるのは本当にわかりません。 – David

+1

一部のコンパイラは、インライン展開や他のいくつかの最適化にもかかわらず、デバッグ性を保つのに十分なほどスマートですが、おそらく少数です。私はVisual Studioのコンパイラができないと思っています。 –

答えて

2

予測が容易で予測が困難です。単純な式、のように:。

int a = b + (2 * c): 
int d = e + (2 * c); 

が最も簡単な最適化((2 * c)「共通部分式は、」一度だけ計算されますC/C++で

に最適化され得る、方法が一般的にインライン化宣言は必ずしものに(になります)。

トリッキーは、ループの最適化などである。例えば、

for (int i = 1; i < n; i++) { 
    a = i + (2 * c); 
} 

表現(2 * c)意志通常、 "グローバル最適化"を行うコンパイラではループから抜け出しますが、 "ローカル最適化"だけではコンパイラではありません。もちろん、表現ははるかに複雑で畳み込まれることがあります。

上記のループの本体をa = i * (2 * c);に変更し、「ループ誘導」と呼ばれるやや高いレベルのグローバル最適化に進みます。 「スマートな」コンパイラはループを通じた各反復に対して、2 * c(あらかじめ計算されたもの)をaに追加するだけで、各反復で(より高価な)乗算を行うことができます。

これは表面を傷つけるだけです。

しかし、私はVisual Studioコンパイラが何をすることができるか分かりません。

関連する問題