您的位置:首页 > 其它

动态链接和静态链接

2012-10-09 19:16 190 查看
理解静态链接和动态链接 前些日子在论坛上看到这样两个问题:

1、什么叫静态链接和动态链接?(static linking,dynamic linking)

2、如何理解先期和迟后联编?(early binding,later binding)

3、连接时所需的库lib和dll。

实际上,这两个问题性质是一样的,不管是静态链接/动态链接也好,还是先期联编/迟后联编也好,都是描述了何时确定应用程序所调用函数的入口地址,如果编译器在编译时或链接时确定了所有函数的入口地址,那么这种确定地址的方法称为静态链接或者先期联编。如果是在运行时确定所有函数的入口地址,那么这种确定地址的方法称为动态链接或者迟后联编。C++通过使用虚拟函数支持动态链接/迟后联编(也叫做动态联编),它们发生在运行时刻,这样一来,使用多重继承的程序便会有更大的灵活性。

下面我们用一段代码来加以说明:

class A {

public:   A();

int memberFunc();

virtual int virtualFunc();

static int staticFunc()'

}

int main()

{

A* pa;   //  ... - initializing pa

pa->memberFunc();

pa->vitrualFunt();

pa->staticFunc();

}


当编译这段代码时,编译器在编译期间可以知道确切的函数信息,比如函数署名叫:“memberFunc”、“staticFunc”等----此即为静态链接/先期联编。但是在调用virtualFunc函数时,只能在运行时得知该函数的信息,此时函数才会被真正调用,因为代码可能是下面这样的: class B : public A { public //... virtual int virtualFunc(); } 并且如果 'pa' 被赋值 pa
= new B(); 那么类B的函数将会被调用并执行----此即为动态链接/迟后联编。

对于连接所需的库:

简单地讲:

第一:DLL是动态链接库,而.LIB是静态链接库

dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, 如果调用lib中的函数,在工程编译时,这些调用的函数都将参加编译.

第二:从内存管理的角度来看,lib必须被链接到主程序中,主程序进入内存,lib也同时进入内存。而dll则是需要用到它的时候由操作系统调入内存。从复用性的角度来看,lib因为必须参加编译,所以复用性就不如DLL啦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: