В чем основное различие между динамической загрузкой и динамическим связыванием в 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();
}
Вызов функции еще не известен во время компиляции, это может быть Base :: method или Derived :: method, в зависимости от типа времени выполнения pBase. Вот почему это называется dyanmic привязкой (или поздним связыванием), фактический вызов метода ищется, когда вызов фактически должен произойти.
С другой стороны у нас динамическая и статическая нагрузка. Это связано с загрузкой библиотек. Одна из возможностей — создать статическую библиотеку — файл с объектным кодом, который будет связан с вашей программой, когда компилятор компилирует и связывает ее. Он не может быть изменен после компиляции, так как его — и отсюда и название — статически привязан к вашей программе.
Однако, если вы собираетесь использовать динамическую загрузку, а не добавлять код в программу во время компиляции, вы загружаете ее во время выполнения. Различные операционные системы предлагают различные методы для этого. Для пользователей Windows файлы DLL не должны быть чем-то неизвестным. Они содержат объектный код, и когда программа запрашивает код, она загружает DLL, которая предоставляет код, и выполняет этот код. Это позволяет вам добавить другую версию DLL без необходимости перекомпиляции вашей программы (при условии, что сигнатура и общее поведение остаются неизменными) — мы можем сказать, что она динамическая.
Других решений пока нет …