静态链接和动态链接

来源:互联网 发布:新站怎么做优化 编辑:程序博客网 时间:2024/05/21 14:08

大家都知道应用程序有两种链接方式,一种是静态链接,一种是动态链接,这两种链接方式各有好处。

程序的静态连接还是动态连接是根据编译器的连接参数指定的。

所谓静态链接就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些。(所谓库就是一些功能代码经过编译连接后的可执行形式。)

所谓动态链接就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能

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

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()' } 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的函数将会被调用并执行----此即为动态链接/迟后联编。