2013-03-28 16 views
6

あなたのコンパイラで完全な最適化を有効にしてこのようなクラスを設定しているしている場合:C++:関数ラッパーはインラインで動作しますか?

class A 
{ 
    void Do_A_Stuff(); 
}; 
class B 
{ 
    A a; 
    void Do_B_Stuff() { a.Do_A_Stuff(); } 
}; 
class C 
{ 
    B b; 
    void Do_C_Stuff() { b.Do_B_Stuff(); } 
}; 
class D 
{ 
    C c; 
    void Do_D_Stuff() { c.Do_C_Stuff(); } 
}; 

は、これまでDo_D_Stuff()を呼び出すと直接Do_A_Stuff()を呼び出すよりも遅くなるような状況はありますか?また、これは各ラッパー 'チェーン'のキーワードinlineを必要としますか?それは単なる提案なので、コンパイラーはキーワードなしでこれを最適化することができますか?

インライン化について多くの情報がありますが、多くのラッパーを連鎖させることについての情報は特に見つかりませんでした。

答えて

7

また、各ラッパー 'チェーン'にインラインキーワードが必要ですか、それは単なる提案なので、キーワードなしで最適化することができますか?

はい、コンパイラはとにかくそれを最適化することを決定することができ、そしてそれはまた、あなたがinlineキーワード(適切なコンパイラオプションが設定されている場合は、おそらく、警告を生成する)指定された場合でも、それを最適化するためにないを決めることができました - 通知をクラス定義で定義されたメンバー関数は暗黙的にinlineとマークされます。

一般に、インライン展開が可能であれば、コンパイラは呼び出される関数の本体に基づいてインラインにするかどうかを決定します。ただし、関数が仮想関数である場合、または関数の定義がコンパイラに表示されない場合、インライン化はまったく不可能です。

ただし、インライン化の条件が満たされ、コンパイラが適切であると判断した場合、一連の関数呼び出しにインライン化する際に技術的な問題はありません。

軽度の注意として、クラス内の関数はpublicである必要があります。そうでないとラッパーからアクセスできなくなります。

+0

はい、関数は 'public'でなければなりません、私は簡潔にするつもりでした。 :) – Jonathan

+0

* "または関数の定義がコンパイラに見えない場合" * - これは[リンクタイムコード生成]に適用されます(http://msdn.microsoft.com/en-us/library/xbf3tbeh (v = vs80).aspx)をMSVC(または他のコンパイラの同等のもの)で使用していますか?私はいつもそれに興味があります。 – JBentley

+1

@JBentley:モジュール間のインライン展開も可能です。確認できる[この関連Q&A](http://stackoverflow.com/questions/5987020/can-the-linker-inline-functions)もあります。 –

0

この関数はクラス定義内で定義されているため、inlineキーワードは暗黙的です。

+1

クラス定義の外側で 'inline'を使用しても、コンパイラがコードを'インライン化する 'という保証はありません。決定するのはコンパイラの責任です。 – Tushar

+0

コンパイラは 'inline'としてマークされていない関数をインライン化し、' inline'としてマークされたインライン関数はインライン化できません。 – GManNickG

関連する問題