7

コンパイラで完全な最適化を有効にし、クラスを次のように設定した場合:

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各ラッパーの「チェーン」にキーワードが必要ですか、それとも単なる提案であるため、コンパイラーはキーワードなしでこれを最適化することを決定できますか?

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

4

2 に答える 2

8

また、これには各ラッパーの「チェーン」にインラインキーワードが必要ですか、それとも単なる提案であるため、コンパイラはキーワードなしでこれを最適化することを決定できますか?

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

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

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

マイナーな発言として、クラスの関数は である必要があることに注意してくださいpublic。そうしないと、ラッパーからアクセスできなくなります。

于 2013-03-28T23:39:29.860 に答える
0

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

于 2013-03-28T23:38:56.637 に答える