1

次の C++ 疑似コードを検討してください。

class C { 
   int a,b,c;
   inline void simple_method() { /* whatever */ }
   void complex_method();
}
C foo,bar;

int main() {
   foo.complex_method();
   bar.simple_method();
}

わかった。生成されたアセンブリ コードにbar.simple_method()は、明らかに変数 bar.a、bar.b などへの直接参照が含まれます。つまり、オブジェクト ポインタを経由しません。

ただし、インライン化されていないメソッドは、オブジェクト ポインターを介してすべてにアクセスします。しかし、アドレシング機能が制限されているか、GCC があまりよく理解していない組み込みコントローラーをプログラミングしているため、結果のアセンブリ コードは非常に遅く、肥大化しています。

を使用always_inlineすると、高速で適度にきれいなコードが生成されます。しかし、complex_method() の呼び出し元が複数あるため、これは実行可能な解決策ではありません。

私が思いついたこの問題を解決する最善の方法は、 on を平手打ちしalways_inline、次X::complex_method()の行に沿ってラッパーのヒープを作成することです

 void _foo_complex_method() { foo.complex_method(); }

そして、これらのラッパーを常に使用することを忘れないでください。

この例のように、クラスが 1 つ、複雑なメソッドが 1 つ、グローバルが 2 つある場合、これは簡単です。問題は、私たちの現在の設計にはこれらのものがかなり多くあることです。これらすべてのラッパーの引数リストと戻り値をまっすぐに保つことは、大きな頭痛の種です。その上、メソッドへの新しい直接呼び出しを毎週発見しています。:-/

したがって、同じことを達成するためのより簡単なイディオム (興味深い複雑なテンプレートや C++ で悪名高いものすべてに実装されている可能性があります ;-) があるのではないかと思います。

4

0 に答える 0