當前位置:才華齋>計算機>C語言>

C語言靜態庫與動態庫的區別

C語言 閱讀(1.34W)

C語言靜態庫與動態庫的區別是什麼呢?一起來看看下面的相關內容吧!更多內容請關注應屆畢業生考試網!

C語言靜態庫與動態庫的區別

 區別1:目標檔案連結成可執行檔案階段,庫函式(庫函式本身有一個程式碼段)連結進可執行檔案(程式碼段)中,佔了很大的記憶體空間。而使用動態庫時,只是在連結時做了一個printf的標記,當可執行程式執行時才會載入這段printf(從庫路徑中載入動態連結庫檔案),這樣就節省了可執行程式的空間,只有在執行這段很短的時間會佔用可執行程式的空間。

可以做個測試,寫一個輸出hello world的小程式,一般是Linux下gcc中是預設是使用動態庫的,可以看到可執行程式的大小隻有7千多k,而使用靜態庫,連結後生成可執行程式時把printf也連結到了可執行程式中,這時候可執行程式就有700多K了。

 區別2:使用動態庫對庫的依賴性太強,一般釋出的話需要庫檔案(庫檔案要放在相應的庫路徑中)也釋出。、

靜態連結庫對庫的依賴性不會有那麼強。靜態庫就像房車,出門旅遊不用依賴住房,但是房車佔空間;動態庫就像小車,出門旅遊依賴要住酒店,但是小車省空間。

實際上使用動態庫在執行的時候載入printf也會佔用可執行程式,在執行時佔用可執行程式的空間其實是跟靜態庫是一樣的。

但是試想:一個可執行程式中有多個檔案(如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語言卻是在網路下層工作的,要對協議比較瞭解。總之,各有各的好處,各有各的領域。