C語(yǔ)言靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別
C語(yǔ)言靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別是什么呢?一起來(lái)看看下面的相關(guān)內(nèi)容吧!更多內(nèi)容請(qǐng)關(guān)注應(yīng)屆畢業(yè)生考試網(wǎng)!
區(qū)別1:在目標(biāo)文件鏈接成可執(zhí)行文件階段,庫(kù)函數(shù)(庫(kù)函數(shù)本身有一個(gè)代碼段)鏈接進(jìn)可執(zhí)行文件(代碼段)中,占了很大的內(nèi)存空間。而使用動(dòng)態(tài)庫(kù)時(shí),只是在鏈接時(shí)做了一個(gè)printf的標(biāo)記,當(dāng)可執(zhí)行程序運(yùn)行時(shí)才會(huì)加載這段printf(從庫(kù)路徑中加載動(dòng)態(tài)鏈接庫(kù).so文件),這樣就節(jié)省了可執(zhí)行程序的空間,只有在運(yùn)行這段很短的時(shí)間會(huì)占用可執(zhí)行程序的空間。
可以做個(gè)測(cè)試,寫(xiě)一個(gè)輸出hello world的小程序,一般是Linux下gcc中是默認(rèn)是使用動(dòng)態(tài)庫(kù)的,可以看到可執(zhí)行程序a.out的大小只有7千多k,而使用靜態(tài)庫(kù),鏈接后生成可執(zhí)行程序時(shí)把printf也鏈接到了可執(zhí)行程序中,這時(shí)候可執(zhí)行程序就有700多K了。
區(qū)別2:使用動(dòng)態(tài)庫(kù)對(duì)庫(kù)的依賴(lài)性太強(qiáng),一般發(fā)布的話(huà)需要庫(kù)文件(庫(kù)文件要放在相應(yīng)的庫(kù)路徑中)也發(fā)布。、
靜態(tài)鏈接庫(kù)對(duì)庫(kù)的依賴(lài)性不會(huì)有那么強(qiáng)。靜態(tài)庫(kù)就像房車(chē),出門(mén)旅游不用依賴(lài)住房,但是房車(chē)占空間;動(dòng)態(tài)庫(kù)就像小車(chē),出門(mén)旅游依賴(lài)要住酒店,但是小車(chē)省空間。
實(shí)際上使用動(dòng)態(tài)庫(kù)在運(yùn)行的時(shí)候加載printf也會(huì)占用可執(zhí)行程序,在運(yùn)行時(shí)占用可執(zhí)行程序的空間其實(shí)是跟靜態(tài)庫(kù)是一樣的。
但是試想:一個(gè)可執(zhí)行程序a.out中有多個(gè)文件(如a應(yīng)用程序,b應(yīng)用程序,c文件程序),a,b,c都需要調(diào)用printf。
使用靜態(tài)庫(kù)時(shí),鏈接時(shí)就鏈接了三份printf,運(yùn)行時(shí)就加載三份printf,產(chǎn)生多分副本,白白浪費(fèi)內(nèi)存。而使用動(dòng)態(tài)庫(kù)時(shí),鏈接時(shí),只是將printf的標(biāo)記鏈接進(jìn)了可執(zhí)行程序a,out,運(yùn)行時(shí)printf只用加載一份,a調(diào)用時(shí)就是調(diào)用這一份printf,b調(diào)用時(shí)也是調(diào)用這一份printf。-------這才是動(dòng)態(tài)庫(kù)相對(duì)于靜態(tài)庫(kù)真正的優(yōu)勢(shì)!
【相關(guān)閱讀】C語(yǔ)言與JAVA的區(qū)別
C語(yǔ)言
C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,應(yīng)用廣泛。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。
Java
Java是一門(mén)面向?qū)ο缶幊陶Z(yǔ)言,不僅吸收了C++語(yǔ)言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語(yǔ)言具有功能強(qiáng)大和簡(jiǎn)單易用兩個(gè)特征。Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的'代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚,允許程序員以?xún)?yōu)雅的思維方式進(jìn)行復(fù)雜的編程
在語(yǔ)法中
單文件的編譯時(shí)間java比C語(yǔ)言快;
C語(yǔ)言可以直接操作內(nèi)存,java不能直接操作;
C語(yǔ)言可以封裝動(dòng)態(tài)庫(kù),java不行;
C語(yǔ)言的代碼不容易跨平臺(tái),java的代碼容易跨平臺(tái);
C語(yǔ)言有指針,java沒(méi)有指針;
C語(yǔ)言可以直接操作串口,java需要第三方j(luò)ar包支持;
C語(yǔ)言的線(xiàn)程更加靈活,java的線(xiàn)程都已經(jīng)封裝好了;
C語(yǔ)言做單獨(dú)功能,可以增加效率,java適用做web應(yīng)用開(kāi)發(fā);
unix是C語(yǔ)言編寫(xiě)的,java也是C語(yǔ)言編寫(xiě)的;
JAVA做web開(kāi)發(fā)的時(shí)候,已經(jīng)有很多成型的框架技術(shù),C語(yǔ)言很少,且需要處理底層內(nèi)容,對(duì)應(yīng)不熟悉計(jì)算機(jī)原理的開(kāi)發(fā)者難度很大;
JAVA的開(kāi)源包太多了,C語(yǔ)言也有但是偏少,而且面向某個(gè)業(yè)務(wù)應(yīng)用領(lǐng)域的框架沒(méi)java多;
在內(nèi)存的管理中
C語(yǔ)言在使用完一塊內(nèi)存時(shí),要手動(dòng)把內(nèi)存釋放掉,如果不釋放的話(huà),運(yùn)行久了,程序很容易就會(huì)崩潰掉的。由于需要顯式的歸還內(nèi)存,因此當(dāng)一個(gè)函數(shù)需要將一塊內(nèi)存返回給調(diào)用者的時(shí)候,問(wèn)題就比較復(fù)雜了。所以我們所以時(shí)要注意:(1) 在調(diào)用者中先分配好內(nèi)存,作為參數(shù)傳入到被調(diào)用的函數(shù)中(2) 在被調(diào)用的函數(shù)中分配,使用完后在調(diào)用者中釋放(3) 在被調(diào)用函數(shù)中使用static變量,可以將該變量返回。
而JAVA基本不用考慮內(nèi)存的問(wèn)題,如果想用一個(gè)對(duì)象,new一個(gè)就可以,這個(gè)過(guò)程的背后則是JRE為對(duì)象分類(lèi)的一定內(nèi)存,當(dāng)JRE發(fā)現(xiàn)你不再使用這個(gè)對(duì)象的時(shí)候,他就會(huì)自動(dòng)回收內(nèi)存,也就是說(shuō)你只管借東西,不用管歸還,因?yàn)榕c有人當(dāng)你的跟班,在你不使用的時(shí)候就把東西歸還了,不過(guò)這個(gè)過(guò)程還是有的,只不過(guò)是JRE作的而已。
語(yǔ)法中使用的基本類(lèi)型
C語(yǔ)言有著很多的基本類(lèi)型如:(boolean, char, byte, short, int, long, float, double,struct, union, enum)還有數(shù)組,指針等等。
在JAVA中:只有(boolean, char, byte, short, int, long, float, double)這8種基本類(lèi)型和引用的。
在繼承中
兩種語(yǔ)言都支持方法重載的
C語(yǔ)言是多線(xiàn)繼承,比如:小轎車(chē)和貨車(chē)都繼承了汽車(chē)類(lèi),奧迪2000是繼承小轎車(chē)的,東風(fēng)大卡車(chē)是繼承貨車(chē),這樣奧迪2000也可以繼承貨車(chē),東風(fēng)大卡車(chē)也可以繼承小轎車(chē)。
JAVA是單繼承的,比如:小轎車(chē)和貨車(chē)都繼承了汽車(chē)類(lèi),奧迪2000是繼承小轎車(chē)的,東風(fēng)大卡車(chē)是繼承貨車(chē),這樣奧迪2000就不能繼承貨車(chē),當(dāng)然東風(fēng)大卡車(chē)也不能繼承小轎車(chē)。
初始值
在C語(yǔ)言中,是可以不初始化使用的
而在JAVA中,是必須初始化值的
抽象方法或抽象類(lèi)
C語(yǔ)言的對(duì)等語(yǔ)法是“純虛函數(shù)”和“抽象類(lèi)”
Java使用abstract關(guān)鍵字修飾抽象方法或抽象類(lèi),final類(lèi)不能被繼承
都使用抽象類(lèi)作為繼承層次中的基類(lèi),提供一般概念,由子類(lèi)實(shí)現(xiàn)其抽象方法,且抽象類(lèi)都不能被直接實(shí)例化為對(duì)象
可以看出,JAVA比C語(yǔ)言要精簡(jiǎn)很多,在生活上的實(shí)用性也很強(qiáng),C語(yǔ)言卻是在操作內(nèi)存上比較強(qiáng)。也就是說(shuō)JAVA比較適合在上層工作,只要我們懂得接口就好,而C語(yǔ)言卻是在網(wǎng)絡(luò)下層工作的,要對(duì)協(xié)議比較了解?傊,各有各的好處,各有各的領(lǐng)域。
【C語(yǔ)言靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別】相關(guān)文章:
1.怎樣創(chuàng)建Linux靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)
2.JNI是怎樣java調(diào)用c動(dòng)態(tài)庫(kù)
4.關(guān)于在Linux平臺(tái)上接靜態(tài)庫(kù)和共享庫(kù)的使方法
5.Java中靜態(tài)綁定和動(dòng)態(tài)綁定的區(qū)別