C语言 百分网手机站

C语言静态库与动态库的区别

时间:2020-10-09 20:42:57 C语言 我要投稿

C语言静态库与动态库的区别

  C语言静态库与动态库的区别是什么呢?一起来看看下面的相关内容吧!更多内容请关注应届毕业生考试网!

  区别1:在目标文件链接成可执行文件阶段,库函数(库函数本身有一个代码段)链接进可执行文件(代码段)中,占了很大的内存空间。而使用动态库时,只是在链接时做了一个printf的标记,当可执行程序运行时才会加载这段printf(从库路径中加载动态链接库.so文件),这样就节省了可执行程序的空间,只有在运行这段很短的时间会占用可执行程序的空间。

  可以做个测试,写一个输出hello world的小程序,一般是Linux下gcc中是默认是使用动态库的,可以看到可执行程序a.out的大小只有7千多k,而使用静态库,链接后生成可执行程序时把printf也链接到了可执行程序中,这时候可执行程序就有700多K了。

  区别2:使用动态库对库的依赖性太强,一般发布的话需要库文件(库文件要放在相应的库路径中)也发布。、

  静态链接库对库的依赖性不会有那么强。静态库就像房车,出门旅游不用依赖住房,但是房车占空间;动态库就像小车,出门旅游依赖要住酒店,但是小车省空间。

  实际上使用动态库在运行的时候加载printf也会占用可执行程序,在运行时占用可执行程序的空间其实是跟静态库是一样的。

  但是试想:一个可执行程序a.out中有多个文件(如a应用程序,b应用程序,c文件程序),a,b,c都需要调用printf。

  使用静态库时,链接时就链接了三份printf,运行时就加载三份printf,产生多分副本,白白浪费内存。而使用动态库时,链接时,只是将printf的标记链接进了可执行程序a,out,运行时printf只用加载一份,a调用时就是调用这一份printf,b调用时也是调用这一份printf。-------这才是动态库相对于静态库真正的优势!

  【相关阅读】C语言与JAVA的区别

  C语言

  C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

  Java

  Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的'代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程

  在语法中

  单文件的编译时间java比C语言快;

  C语言可以直接操作内存,java不能直接操作;

  C语言可以封装动态库,java不行;

  C语言的代码不容易跨平台,java的代码容易跨平台;

  C语言有指针,java没有指针;

  C语言可以直接操作串口,java需要第三方jar包支持;

  C语言的线程更加灵活,java的线程都已经封装好了;

  C语言做单独功能,可以增加效率,java适用做web应用开发;

  unix是C语言编写的,java也是C语言编写的;

  JAVA做web开发的时候,已经有很多成型的框架技术,C语言很少,且需要处理底层内容,对应不熟悉计算机原理的开发者难度很大;

  JAVA的开源包太多了,C语言也有但是偏少,而且面向某个业务应用领域的框架没java多;

  在内存的管理中

  C语言在使用完一块内存时,要手动把内存释放掉,如果不释放的话,运行久了,程序很容易就会崩溃掉的。由于需要显式的归还内存,因此当一个函数需要将一块内存返回给调用者的时候,问题就比较复杂了。所以我们所以时要注意:(1) 在调用者中先分配好内存,作为参数传入到被调用的函数中(2) 在被调用的函数中分配,使用完后在调用者中释放(3) 在被调用函数中使用static变量,可以将该变量返回。

  而JAVA基本不用考虑内存的问题,如果想用一个对象,new一个就可以,这个过程的背后则是JRE为对象分类的一定内存,当JRE发现你不再使用这个对象的时候,他就会自动回收内存,也就是说你只管借东西,不用管归还,因为与有人当你的跟班,在你不使用的时候就把东西归还了,不过这个过程还是有的,只不过是JRE作的而已。

  语法中使用的基本类型

  C语言有着很多的基本类型如:(boolean, char, byte, short, int, long, float, double,struct, union, enum)还有数组,指针等等。

  在JAVA中:只有(boolean, char, byte, short, int, long, float, double)这8种基本类型和引用的。

  在继承中

  两种语言都支持方法重载的

  C语言是多线继承,比如:小轿车和货车都继承了汽车类,奥迪2000是继承小轿车的,东风大卡车是继承货车,这样奥迪2000也可以继承货车,东风大卡车也可以继承小轿车。

  JAVA是单继承的,比如:小轿车和货车都继承了汽车类,奥迪2000是继承小轿车的,东风大卡车是继承货车,这样奥迪2000就不能继承货车,当然东风大卡车也不能继承小轿车。

  初始值

  在C语言中,是可以不初始化使用的

  而在JAVA中,是必须初始化值的

  抽象方法或抽象类

  C语言的对等语法是“纯虚函数”和“抽象类”

  Java使用abstract关键字修饰抽象方法或抽象类,final类不能被继承

  都使用抽象类作为继承层次中的基类,提供一般概念,由子类实现其抽象方法,且抽象类都不能被直接实例化为对象

  可以看出,JAVA比C语言要精简很多,在生活上的实用性也很强,C语言却是在操作内存上比较强。也就是说JAVA比较适合在上层工作,只要我们懂得接口就好,而C语言却是在网络下层工作的,要对协议比较了解。总之,各有各的好处,各有各的领域。

【C语言静态库与动态库的区别】相关文章:

1.怎样创建Linux静态库和动态库

2.JNI是怎样java调用c动态库

3.C语言与JAVA理论区别

4.关于在Linux平台上接静态库和共享库的使方法

5.Java中静态绑定和动态绑定的区别

6.Linux系统下动态库的生成介绍

7.C语言中指针与数组的区别

8.c语言中什么是静态变量

9.c++ minicsv库的编译错误与解决方案