动态链接和静态链接

理解静态链接和动态链接 前些日子在论坛上看到这样两个问题:

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啦


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值