亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言 百分網(wǎng)手機(jī)站

C語言靜態(tài)庫與動態(tài)庫的區(qū)別

時間:2020-10-09 20:42:57 C語言 我要投稿

C語言靜態(tài)庫與動態(tài)庫的區(qū)別

  C語言靜態(tài)庫與動態(tài)庫的區(qū)別是什么呢?一起來看看下面的相關(guān)內(nèi)容吧!更多內(nèi)容請關(guān)注應(yīng)屆畢業(yè)生考試網(wǎng)!

  區(qū)別1:在目標(biāo)文件鏈接成可執(zhí)行文件階段,庫函數(shù)(庫函數(shù)本身有一個代碼段)鏈接進(jìn)可執(zhí)行文件(代碼段)中,占了很大的內(nèi)存空間。而使用動態(tài)庫時,只是在鏈接時做了一個printf的標(biāo)記,當(dāng)可執(zhí)行程序運行時才會加載這段printf(從庫路徑中加載動態(tài)鏈接庫.so文件),這樣就節(jié)省了可執(zhí)行程序的空間,只有在運行這段很短的時間會占用可執(zhí)行程序的空間。

  可以做個測試,寫一個輸出hello world的小程序,一般是Linux下gcc中是默認(rèn)是使用動態(tài)庫的,可以看到可執(zhí)行程序a.out的大小只有7千多k,而使用靜態(tài)庫,鏈接后生成可執(zhí)行程序時把printf也鏈接到了可執(zhí)行程序中,這時候可執(zhí)行程序就有700多K了。

  區(qū)別2:使用動態(tài)庫對庫的依賴性太強(qiáng),一般發(fā)布的話需要庫文件(庫文件要放在相應(yīng)的庫路徑中)也發(fā)布。、

  靜態(tài)鏈接庫對庫的依賴性不會有那么強(qiáng)。靜態(tài)庫就像房車,出門旅游不用依賴住房,但是房車占空間;動態(tài)庫就像小車,出門旅游依賴要住酒店,但是小車省空間。

  實際上使用動態(tài)庫在運行的時候加載printf也會占用可執(zhí)行程序,在運行時占用可執(zhí)行程序的空間其實是跟靜態(tài)庫是一樣的。

  但是試想:一個可執(zhí)行程序a.out中有多個文件(如a應(yīng)用程序,b應(yīng)用程序,c文件程序),a,b,c都需要調(diào)用printf。

  使用靜態(tài)庫時,鏈接時就鏈接了三份printf,運行時就加載三份printf,產(chǎn)生多分副本,白白浪費內(nèi)存。而使用動態(tài)庫時,鏈接時,只是將printf的標(biāo)記鏈接進(jìn)了可執(zhí)行程序a,out,運行時printf只用加載一份,a調(diào)用時就是調(diào)用這一份printf,b調(diào)用時也是調(diào)用這一份printf。-------這才是動態(tài)庫相對于靜態(tài)庫真正的優(yōu)勢!

  【相關(guān)閱讀】C語言與JAVA的區(qū)別

  C語言

  C語言是一門通用計算機(jī)編程語言,應(yīng)用廣泛。C語言的設(shè)計目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機(jī)器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。

  Java

  Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強(qiáng)大和簡單易用兩個特征。Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的'代表,極好地實現(xiàn)了面向?qū)ο罄碚,允許程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程

  在語法中

  單文件的編譯時間java比C語言快;

  C語言可以直接操作內(nèi)存,java不能直接操作;

  C語言可以封裝動態(tài)庫,java不行;

  C語言的代碼不容易跨平臺,java的代碼容易跨平臺;

  C語言有指針,java沒有指針;

  C語言可以直接操作串口,java需要第三方j(luò)ar包支持;

  C語言的線程更加靈活,java的線程都已經(jīng)封裝好了;

  C語言做單獨功能,可以增加效率,java適用做web應(yīng)用開發(fā);

  unix是C語言編寫的,java也是C語言編寫的;

  JAVA做web開發(fā)的時候,已經(jīng)有很多成型的框架技術(shù),C語言很少,且需要處理底層內(nèi)容,對應(yīng)不熟悉計算機(jī)原理的開發(fā)者難度很大;

  JAVA的開源包太多了,C語言也有但是偏少,而且面向某個業(yè)務(wù)應(yīng)用領(lǐng)域的框架沒java多;

  在內(nèi)存的管理中

  C語言在使用完一塊內(nèi)存時,要手動把內(nèi)存釋放掉,如果不釋放的話,運行久了,程序很容易就會崩潰掉的。由于需要顯式的歸還內(nèi)存,因此當(dāng)一個函數(shù)需要將一塊內(nèi)存返回給調(diào)用者的時候,問題就比較復(fù)雜了。所以我們所以時要注意:(1) 在調(diào)用者中先分配好內(nèi)存,作為參數(shù)傳入到被調(diào)用的函數(shù)中(2) 在被調(diào)用的函數(shù)中分配,使用完后在調(diào)用者中釋放(3) 在被調(diào)用函數(shù)中使用static變量,可以將該變量返回。

  而JAVA基本不用考慮內(nèi)存的問題,如果想用一個對象,new一個就可以,這個過程的背后則是JRE為對象分類的一定內(nèi)存,當(dāng)JRE發(fā)現(xiàn)你不再使用這個對象的時候,他就會自動回收內(nèi)存,也就是說你只管借東西,不用管歸還,因為與有人當(dāng)你的跟班,在你不使用的時候就把東西歸還了,不過這個過程還是有的,只不過是JRE作的而已。

  語法中使用的基本類型

  C語言有著很多的基本類型如:(boolean, char, byte, short, int, long, float, double,struct, union, enum)還有數(shù)組,指針等等。

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

  在繼承中

  兩種語言都支持方法重載的

  C語言是多線繼承,比如:小轎車和貨車都繼承了汽車類,奧迪2000是繼承小轎車的,東風(fēng)大卡車是繼承貨車,這樣奧迪2000也可以繼承貨車,東風(fēng)大卡車也可以繼承小轎車。

  JAVA是單繼承的,比如:小轎車和貨車都繼承了汽車類,奧迪2000是繼承小轎車的,東風(fēng)大卡車是繼承貨車,這樣奧迪2000就不能繼承貨車,當(dāng)然東風(fēng)大卡車也不能繼承小轎車。

  初始值

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

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

  抽象方法或抽象類

  C語言的對等語法是“純虛函數(shù)”和“抽象類”

  Java使用abstract關(guān)鍵字修飾抽象方法或抽象類,final類不能被繼承

  都使用抽象類作為繼承層次中的基類,提供一般概念,由子類實現(xiàn)其抽象方法,且抽象類都不能被直接實例化為對象

  可以看出,JAVA比C語言要精簡很多,在生活上的實用性也很強(qiáng),C語言卻是在操作內(nèi)存上比較強(qiáng)。也就是說JAVA比較適合在上層工作,只要我們懂得接口就好,而C語言卻是在網(wǎng)絡(luò)下層工作的,要對協(xié)議比較了解?傊饔懈鞯暮锰,各有各的領(lǐng)域。

【C語言靜態(tài)庫與動態(tài)庫的區(qū)別】相關(guān)文章:

1.怎樣創(chuàng)建Linux靜態(tài)庫和動態(tài)庫

2.JNI是怎樣java調(diào)用c動態(tài)庫

3.C語言與JAVA理論區(qū)別

4.關(guān)于在Linux平臺上接靜態(tài)庫和共享庫的使方法

5.Java中靜態(tài)綁定和動態(tài)綁定的區(qū)別

6.Linux系統(tǒng)下動態(tài)庫的生成介紹

7.C語言中指針與數(shù)組的區(qū)別

8.c語言中什么是靜態(tài)變量

9.c++ minicsv庫的編譯錯誤與解決方案