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