2009年12月4日 星期五

Burden of Using Dynamic Link Library

濫用DLL是我長久以來看到的一個現象。這裡提到DLL泛指各平台的dynamic link library,不是單指Windows的DLL。而且dynamic link也分成Load-Time Linking 與Run-Time Lining兩大類,本文是針對Load-Time Linking做個探討。

為何說濫用呢?

不知所為何事,就是濫用。我看到的狀況是通常都在不知道DLL的好處(或者是壞處)的情況下就決定每個Module都要寫成DLL,以為只要寫成DLL就一定有好處,其實不然。

迷思1. 用DLL程式開啓會變快

其實很多在DLL裡用到的東西一開始就用到了,所以代表一開始就得把DLL載入,所以也沒有速度的優勢,反而要付出一些進行Dynamic linking或 Mapping的時間。

迷思2. 用DLL程式開啓記憶體會耗的比較少

同上,如果你的程式在一開始就用到了DLL內的東西,這樣一來程式一開啓就會把用到的DLL一一載入,並且因為它是DLL所以就用不到static link時的dead code stripping或類似的功能,所以反而比用static link時所耗費的記憶體多。

迷思3. 用DLL程式容易維護

用DLL程式容易維護的主因是倘若DLL裡的程式碼有bug,只要修改與更新系統中的DLL即可。但是我看到的現象都是只要更新就是連主程式全部一起更新(不用重寫Installer,反正也沒有多大等等因素),這當然也都跟規劃有關。

事實

用DLL有一個最嚴重的缺點就是C++的Calling Convention不統一,導致用C++當界面的DLL除非用的compiler是同一個版本(或者說用同樣的calling convention去編譯),不然主程式是沒辦法使用的,執行期會跑不起來。
所以我個人的看法是,決定要不要用成DLL,請三思而後行,不然吃力不討好,得不償失。

4 則留言:

  1. 沒有svn external link 的 幫助,哪個dll哪個.h該放哪裡,各個module之間的連動,對剛接觸project的新人來講也是噩夢。
    C++的Calling Convention不統一
    精闢 !
    對我來說module太多對project convert 也是一個噩夢 XD

    回覆刪除
  2. 其實我沒用過dll...暈惹T^T

    回覆刪除
  3. 補充一下chen曾經貼的
    Dll Hell (夠聳動)
    http://en.wikipedia.org/wiki/DLL_hell

    回覆刪除