动态加载和动态绑定之间的区别

时间:2013-06-22 11:29:05

标签: c++ dynamic-loading dynamic-binding

c ++中动态加载和动态绑定的主要区别是什么?

为什么动态加载被称为静态?

1 个答案:

答案 0 :(得分:3)

这个问题有几个方面。如果我们谈论对象,我们谈论动态绑定。让我们考虑以下情况

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而无需重新编译程序(只要签名和一般行为保持不变) - 我们可以说它是动态的。