次の 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++ で悪名高いものすべてに実装されている可能性があります ;-) があるのではないかと思います。