c++での動的ロードと動的バインディングの主な違いは何ですか?
なぜ動的読み込みが静的と呼ばれるのですか?
この質問にはいくつかの側面があります。オブジェクトについて話す場合、動的バインディングについて話します。次の状況を考えてみましょう
class Base {
public:
virtual void method() { std::cout << "Base::method" << std::endl; }
};
class Derived : public Base {
public:
virtual void method() { std::cout << "Derived::method" << std::endl; }
};
// ....
void testMethod(Base* pBase) {
pBase->method();
}
関数呼び出しはコンパイル時にはまだ不明です。pBase のランタイム タイプに応じて、Base::method または Derived::method になる可能性があります。これが、動的バインディング (または遅延バインディング) と呼ばれる理由です。実際のメソッド呼び出しは、呼び出しが実際に行われようとしているときに検索されます。
一方、動的負荷と静的負荷があります。これは、ライブラリのロードに関連しています。1 つの可能性は、静的ライブラリ (オブジェクト コードを含むファイル) を作成することです。これは、コンパイラがプログラムをコンパイルおよびリンクするときにプログラムにリンクされます。コンパイル後に変更することはできません。名前の由来は、プログラムに静的にバインドされているためです。
ただし、コンパイル時にコードをプログラムに追加するのではなく、動的にロードする場合は、実行時にコードをロードします。オペレーティング システムが異なれば、そのためのさまざまな方法が提供されます。Windows ユーザーにとって、DLL ファイルは不明なものであってはなりません。それらにはオブジェクトコードが含まれており、プログラムによってコードが要求されると、コードを提供するDLLをロードしてそのコードを実行します。これにより、プログラムを再コンパイルすることなく、異なるバージョンの DLL を追加できます (署名と一般的な動作が同じである限り) - これは動的であると言えます。