ProgrammingC++開発者

静的バインディングと動的バインディングの違いを説明してください。どのアプローチがいつ効果的か、なぜですか?

Hintsage AIアシスタントで面接を突破

回答

静的バインディング(イーリー・バインディング、コンパイル時):

  • コンパイル時に発生する。
  • 関数が直接呼び出され、関数のアドレスがコンパイラに知られている。
  • 例:通常の(非仮想)クラスメンバー、グローバル関数。
void greet() { std::cout << "こんにちは!"; }

動的バインディング(レイト・バインディング、ランタイム):

  • 実行時に仮想関数テーブル(vtable)を介して決定される。
  • ポリモーフィズムをサポートするために仮想関数に使用される。
class Animal { public: virtual void speak() { std::cout << "動物"; } }; class Dog : public Animal { public: void speak() override { std::cout << "ワン"; } }; void foo(Animal* a) { a->speak(); } // 動的バインディング

いつ使用するか:

  • 静的バインディングは、小さく、頻繁に呼び出される関数には、ポリモーフィズムが必要ない場合に使用します。オーバーヘッドが少ない。
  • 動的バインディングは、子オブジェクトの動作を実行中に変更する必要がある場合、事前にオブジェクトの正確なタイプを知ることができない場合に使用します。

トリックの質問

overrideキーワードの使用は仮想関数の動作を高速化しますか?

回答: いいえ、overrideキーワードは関数が仮想基底関数をオーバーライドする必要があることをコンパイラに明示的に示すだけです。パフォーマンスや関数の呼び出し方法には影響しません。

class A { public: virtual void func(); }; class B : public A { public: void func() override; // コンパイラの確認用だが、呼び出しの速度は変わらない };

テーマの詳細を知らないことによる実際のエラーの例


ストーリー

高負荷な株式市場のライブラリで、チームはポリモーフィズムが必要でない場合でもほとんどの操作に仮想メソッドを使用しました。その結果、システムは計画よりも遅く動作し、主要なボトルネックはvtableルックアップでした。


ストーリー

拡張可能なアルゴリズムのプロジェクトでは、スタッフが仮想の代わりに通常のメソッドを使用していました。後に基本ポインタを介してオブジェクトを渡すと動作が変わらず、誤った計算が発生し、バグはインターフェースを書き直すことでしか修正できませんでした。


ストーリー

メディアファイルの解析プロジェクトで、開発者は静的メソッドと仮想メソッドを混同しました。異なるフォーマットのいくつかの関数を仮想メソッドとして宣言し忘れ、子クラスでオーバーライドしなかったため、ファイルの処理が誤った道を通り、結果が誤ってキャッシュされました。