❶ c++裡面什麼時候用到動態聯編(綁定),什麼時候用到靜態聯編
聯編是指一個計算機程序自身彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法:靜態聯編和動態聯編。 靜態聯編 靜態聯編是指聯編工作出現在編譯連接階段,這種聯編又稱早期聯編,因為這種聯編過程是在程序開始運行之前完成的。 在編譯時所進行的這種聯編又稱靜態束定。在編譯時就解決了程序中的操作調用與執行該操作代碼間的關系,確定這種關系又稱為束定,在編譯時束定又稱靜態束定。下面舉一個靜態聯編的例子。 #include class Point
{
public: Point(double i, double j)
{ x=i; y=j; }
double Area()
const { return 0.0; }
private: double x, y; };
class Rectangle:public Point { public: Rectangle(double i, double j, double k, double l);
double Area() const { return w*h; } private: double w, h; };
Rectangle::Rectangle(double i, double j, double k, double l):Point(i, j) { w=k; h=l; } void fun(Point &s) { cout<< }
void main()
{ Rectangle rec(3.0, 5.2, 15.0, 25.0); fun(rec); }
該程序的運行結果為: 0 輸出結果表明在fun()函數中,s所引用的對象執行的Area()操作被關聯到Point::Area()的實現代碼上。這是因為靜態聯編的結果。在程序編譯階段,對s所引用的對象所執行的Area()操作只能束定到Point類的函數上。因此,導致程序輸出了所不期望的結果。因為我們期望的是s引用的對象所執行的Area()操作應該束定到Rectangl類的Area()函數上。這是靜態聯編所達不到的。 動態聯編 從對靜態聯編的上述分析中可以知道,編譯程序在編譯階段並不能確切知道將要調用的函數,只有在程序執行時才能確定將要調用的函數,為此要確切知道該調用的函數,要求聯編工作要在程序運行時進行,這種在程序運行時進行聯編工作被稱為動態聯編,或稱動態束定,又叫晚期聯編。 動態聯編實際上是進行動態識別。在上例中,前面分析過了靜態聯編時,fun()函數中s所引用的對象被束定到Point類上。而在運行時進行動態聯編將把s的對象引用束定到Rectangle類上。可見,同一個對象引用s,在不同階段被束定的類對象將是不同的。那麼如何來確定是靜態聯編還是動態聯編呢?C++規定動態聯編是在虛函數的支持下實現的。 從上述分析可以看出靜態聯編和動態聯編也都是屬於多態性的,它們是不同階段對不同實現進行不同的選擇。上例中,實現上是對fun()函數參數的多態性的選擇。該函數的參數是一個類的對象引用,靜態聯編和動態聯編和動態聯編實際上是在選擇它的靜態類型和動態類型。聯編是對這個引用的多態性的選擇。
❷ 淺談靜態聯編和動態聯編的區別和實現動態聯編的
聯編是指一個程序自身彼此關聯的過程。按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。
靜態聯編又稱靜態綁定,指在調用同名函數(即重載函數)時編譯器將根據調用時所使用的實參在編譯時就確定下來應該調用的函數實現。它是在程序編譯連接階段進行聯編的,這種聯編又稱為早期聯編,這是因為這種聯編工作是在程序運行之前完成的。它的優點是速度快,效率高,但靈活性不夠。
編譯時所進行的聯編又稱為靜態束定。束定是指確定所調用的函數與執行該函數代碼之間的關系。
動態聯編也稱動態綁定,是指在程序運行時,根據當時的情況來確定調用的同名函數的實現,實際上就是在運行時選擇虛函數的實現。這種聯編又稱為晚期聯編或動態(束定。實現條件:①要有繼承性且要求創建子類型關系;)②要有虛函數;③通過基類的對象指針或引用訪問虛函數。繼承是動態聯編的基礎,虛函數是動態聯編的關鍵,虛函數經過派生之後,在類族中就可以實現運行過程中的多態。動態聯編要求在運行時解決程序中的函數調用與執行該函數代碼間的關系,調用虛函數的對象是在運行時確定的。對於同一個對象的引用,採用不同的聯編方式將會被聯編到不同類的對象上。即不同聯編可以選擇不同的實現,這便是多態性。它的優點是靈活性強,但效率較低。
❸ C++中動態連接庫與靜態連接庫的區別
靜態鏈接庫是.lib格式的文件,一般在工程的設置界面加入工程中,程序編譯時會把lib文件的代碼加入你的程序中因此會增加代碼大小,你的程序一運行lib代碼強制被裝入你程序的運行空間,不能手動移除lib代碼。動態鏈接庫是程序運行時動態裝入內存的模塊,格式*.dll,在程序運行時可以隨意載入和移除,節省內存空間。
在大型的軟體項目中一般要實現很多功能,如果把所有單獨的功能寫成一個個lib文件的話,程序運行的時候要佔用很大的內存空間,導致運行緩慢;但是如果將功能寫成dll文件,就可以在用到該功能的時候調用功能對應的dll文件,不用這個功能時將dll文件移除內存,這樣可以節省內存空間。
❹ 靜態連接和動態連接的關系.速度和大小呢
靜態鏈接是在編譯時進行的,靜態鏈接庫(lib文件)實際上就是編譯好的程序代碼,如果有兩個程序都用到了同一個lib的話,且同時運行這兩個程序,那麼內存中會有兩份相同的lib內的代碼(浪費內存)
動態鏈接是在運行時進行的,由操作系統管理,如果兩程序都用同一個DLL的話,實際上內存中只有一份代碼
速度都一樣,文件大小的話一般lib要比dll大寫
❺ 動態鏈接,靜態鏈接 動態編譯,靜態編譯 動態鏈接庫,靜態鏈接庫 這些兩兩間的區別是什麼呢
有點兒亂……,分數少簡單扼要的說說吧。
————————————
首先,傳統的編譯,也就是靜態編譯是把 源文件 翻譯成目標文件,這個是一次性過程,也就是你所謂的靜態編譯。
後來的Java和.NET等語言,首先編譯成中間形式,然後運行過程中根據需要編譯成本地代碼(注意這個過程不是一次性的,下次運行重新編譯),這個就是JIT(即時編譯)技術,從即時編譯發展出了動態編譯技術
————————————
(傳統的)編譯完成後,像C/C++、Fortran、匯編等語言,可以把多個目標文件合並到一個庫文件中,這個就是靜態庫。比如常說的庫函數printf就是libc裡面的函數。
如果有了啟動函數(main),main裡面使用了printf,就可以通過靜態鏈接技術,從libc中提取出printf所在的文件加入到可執行文件中,如果printf還需要其它函數,就繼續搜索並加入列表,直到形成一個閉包。這個就是靜態鏈接。
可是靜態鏈接有個明顯的缺點,如果每個程序都需要printf,那麼printf這個函數的代碼就會同時存在在每個程序中,這樣也太佔地方了吧。所以發明了動態連接技術,其實有兩種形式。無論哪一種,都是首先記錄下需要調用printf這個函數以及所在的動態庫,等到運行的時候再載入動態庫,從動態庫中找到真正的printf去執行。
由於,動態鏈接技術需要一些額外的信息,傳統的靜態庫是不具備的,這些額外信息主要是重復載入和卸載時所需要的一些代碼,因此需要動態鏈接庫。
❻ GCC中靜態連接和動態連接的區別
1:靜態連接的時候,靜態庫的所有執行代碼被直接編譯到目標程序中。而動態連接的時候,僅僅把動態庫的函數和變數的符號名,地址偏移量等導入到目標程序。只有在目標程序運行的時候才把動態庫的執行代碼載入到內存中。
2:動態鏈接的項目容易管理,把不同模塊封裝成不同的動態庫,如果模塊功能修改,一般只需要重新生成該動態庫,不用重新編譯其他模塊和目標程序。而靜態鏈接的程序修改任何一個地方都必須重新編譯整個程序
3:靜態鏈接生成的目標程序體積比動態鏈接的大,但是載入速度更快,發布更容易,不需要檢查發布機器上是否有該動態庫或者動態庫版本是否符合要求。
4:如果多個程序使用一個動態庫,則該庫的執行代碼只會在內存中載入一次。而靜態庫是多次載入(事實上靜態庫連接完就沒用了,等於目標程序的一部分)。
5:從調試的角度來說,靜態連接的程序調試方法和獨立程序沒有任何區別,而動態庫的調試相對要復雜一些,因為庫裡面的符號地址都是相對地址。
❼ 動態鏈接庫和靜態鏈接庫的區別
一、指代不同
1、動態鏈接庫:是微軟公司在微軟Windows操作系統中,實現共享函數庫概念的一種方式。
2、靜態鏈接庫:函數和數據被編譯進一個二進制文件(通常擴展名為*.LIB),Visual C++的編譯器在鏈接過程中將從靜態庫中恢復這些函數和數據並把他們和應用程序中的其他模塊組合在一起生成可執行文件。
二、特點不同
1、動態鏈接庫:庫函數的擴展名是 」.dll"、".ocx"(包含ActiveX控制的庫)或者 ".drv"(舊式的系統驅動程序)。
2、靜態鏈接庫:使用的.lib文件,庫中的代碼最後需要連接到可執行文件中去。
三、調用方法不同
1、動態鏈接庫:提供了一種使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 文件中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。
2、靜態鏈接庫:用程序所需的全部內容都是從庫中復制了出來,所以靜態庫本身並不需要與可執行文件一起發行。
❽ 請問程序的靜態連接是什麼意思,請賜教
這個指的是使用其他DLL的方式.
比如我們寫的代碼需要使用其他人開發的DLL提供的函數,那麼我們的程序需要將這個DLL先載入內存,之後才能使用它(DLL),根據DLL被加入到內存的時機,分為動態連接和靜態連接。
動態連接:
只在使用到DLL的時候才將它載入內存,如果程序在運行過程中,從來沒有執行到使用DLL的分支,那麼這個DLL是不會被載入內存的。
靜態連接:
在程序啟動後立即載入這個DLL,而不是等需要時再進行載入。
在EXE編譯時,如果做成動態連接,那麼DLL是不會被編譯到EXE文件中,所以EXE文件會比較小,但是使用EXE時,必須還同時擁有對應的DLL文件;如果做成靜態連接,那麼這個DLL是要被編譯進EXE中的,這樣EXE文件的體積就會變大。