導航:首頁 > 源碼編譯 > 簡述靜態編譯和動態編譯的區別

簡述靜態編譯和動態編譯的區別

發布時間:2025-03-27 20:11:51

1. 什麼是靜態聯編,什麼是動態聯編

靜態聯編是指在編譯時確定的函數調用關系,而動態聯編則是在運行時根據對象的實際類型來確定調用哪個函數。

靜態聯編,也稱為早期綁定或靜態綁定,是指在程序編譯階段就已經確定了函數或方法的調用關系。在C++中,靜態聯編通常與非虛函數相關。編譯器在編譯時就能根據函數名和參數列表匹配到具體的函數調用。例如,如果我們有一個基類Shape和一個派生類Circle,Shape中有一個非虛的draw函數,當我們通過Shape類型的指針調用draw函數時,無論這個指針實際指向的是Shape對象還是Circle對象,調用的都是Shape中的draw函數,這就是靜態聯編的一個例子。

動態聯編,也稱為晚期綁定或動態綁定,是指在程序運行時根據對象的實際類型來確定調用哪個函數。在C++中,這通常與虛函數相關。當基類中的函數被聲明為虛函數時,編譯器會在運行時通過虛函數表來確定應該調用哪個類的函數實現。繼續上面的例子,如果Shape中的draw函數被聲明為虛函數,那麼當我們通過Shape類型的指針調用draw函數時,如果指針實際指向的是Circle對象,就會調用Circle中的draw函數實現,這就是動態聯編的一個例子。

總的來說,靜態聯編和動態聯編的主要區別在於函數調用的確定時機和方式。靜態聯編在編譯時就已經確定了函數調用關系,而動態聯編則在運行時根據對象的實際類型來確定。這兩種方式各有優缺點,靜態聯編具有較高的執行效率,但靈活性較差;而動態聯編雖然會帶來一定的性能開銷,但它支持多態性,使得程序能夠更加靈活和可擴展。在實際編程中,我們需要根據具體需求來選擇使用哪種聯編方式。

2. 動態編譯和靜態編譯有何主要區別

靜態編譯與動態編譯的區別
1、動態編譯的可執行文件需要附帶一個的動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。所以其優點一方面是縮小了執行文件本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程序,只用到了鏈接庫中的一兩條命令,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應的運行庫,則用動態編譯的可執行文件就不能運行。
2、靜態編譯就是編譯器在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(.so)中的部分提取出來,鏈接到可執行文件中去,使可執行文件在運行的時候不依賴於動態鏈接庫。所以其優缺點與動態編譯的可執行文件正好互補。

3. 怎樣區別APACHE動態和靜態編譯

關於apache的動態與靜態編譯的理解,引用某人的比喻如下:
好比有兩個人a和m,a代表apache,m代表mole,要想讓a使用m的東西,一個方法是把m的東西都放到a那裡去,a使用的時候就是現成的了,就是所謂的靜態編譯
還有一個方法,就是告訴a,m的住址,當a要使用m的東西的時候,a去找m,然後使用,不過,這種方法要注意的一個問題就是:m必須要有實際的住址,否則a會找不到m而產生錯誤的,這種方法也就是apache 的動態(DSO)編譯了。
下面說說在apache1.3和apache2.0動態與靜態編譯編譯的區別
首先是apache1.3.29+php4.3.4+mysql4.0.13的靜態編譯
apache第一次編譯,並不要安裝,因為php的編譯需要apache至少已經編譯過一次
tar zvxf apache_1.3.27.tar.gz
cd apache_1.3.27
./configure --prefix=/usr/local/apache
編譯php
tar zvxf php4.3.4.tar.gz
cd php4.3.4
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apache=../apache_1.3.27
make
make install
第二次編譯安裝apache:
cd ../apache_1.3.29
./configure --prefi=/usr/local/apache --activate-mole=src/moles/php4/libphp4.a
make
make install
cp ../php4.3.4/php.ini.dist /usr/local/php/lib/php.ini

修改/usr/local/apache/conf/httpd.conf
查找<IfMole mod_mime.c>
在此范圍添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
注意:apache和php的源碼包在同一個目錄,--with-apache=../apache_1.3.27是指向源碼解壓的目錄
ok!靜態編譯完成。
再看DSO動態編譯方法:
首先編譯安裝apache
tar zvxf apache_1.3.29
cd apache_1.3.29
./configure --prefix=/usr/local/apache --enable-mole=so --enable-mole=rewrite --enable-shared=max
make
make install
so模塊用來提供DSO支持的apachehe核心模塊,rewrite是地址重寫的模塊,如果不需要可以不編譯enable-shared=max是指除了so以外的所有標准模塊都編譯成DSO模塊。

然後編譯php
tar zvxf php4.3.4.tar.gz
cd php4.3.2
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs=/usr/local/apache/bin/apxs
make
make install
然後修改httpd.conf,方法同靜態編譯的方法
OK,DSO動態編譯就完成了!

接下來我們講apache2.0.46+php4.3.2的動態編譯方法
一樣先編譯安裝apache
tar zvxf httpd-2.0.46.tar.gz
cd httpd-2.0.46
./configure --prefix=/usr/local/apache2 --enable-so --enable-mods-shared=most
make
make install

大家注意了--enable-so相當與1.3.27的--enable-mole=so,而--enable-mods-shared=most又等同與以前的--enable-shared=max
然後還是編譯PHP
tar zvxf php4.3.2.tar.gz
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache2/bin/apxs
make
make install
注意這里是apxs2!!
修改httpd.conf與1.3.27也有所不同,大家尋找Add Type application/x-tar .tgz 在下面添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
另外要顯示中文的話,請修改:
AddDefaultCharset gb2312

閱讀全文

與簡述靜態編譯和動態編譯的區別相關的資料

熱點內容
羽毛球比賽視頻app哪個好 瀏覽:877
艦長拒絕執行命令被免職 瀏覽:272
零向量的運演算法則 瀏覽:491
中信app指紋登錄怎麼設置 瀏覽:241
百度地圖瓦片演算法 瀏覽:224
物流清單結構周期演算法 瀏覽:1000
熱壓縮海綿枕芯枕頭 瀏覽:551
3U源碼編譯不過 瀏覽:140
原生安卓如何看運行內存 瀏覽:381
冷水機組壓縮機機油可以不加熱嗎 瀏覽:182
失戀了什麼APP 瀏覽:981
被app客服騷擾怎麼辦 瀏覽:597
ts伺服器怎麼裝 瀏覽:615
農商銀行app收支匯總怎麼查 瀏覽:686
java添加路徑 瀏覽:87
觀致5發動機壓縮比 瀏覽:265
已連接的網路伺服器怎麼設置 瀏覽:851
怎麼給app改大圖標 瀏覽:934
單片機rs什麼意思 瀏覽:934
都是安卓系統為什麼有些手機好用 瀏覽:887