![]() |
Home | Libraries | People | FAQ | More |
Boost.Function 有幾個超越函數指針的好處,即:
Boost.Function 允許任意的兼容函數對像作為目標(而不需要嚴格的函數識別標識)。
Boost.Function 可以和 argument-binding(參數綁定)及其它 function object construction libraries(函數對像構造庫)一起使用。
當一個 empty function object(空函數對像)被調用時,Boost.Function 有可預期行為。
當然,函數指針也有幾個超越 Boost.Function 的好處:
函數指針更小(只有一個指針而不是三個指針的大小)
函數指針更快(Boost.Function 可能需要兩次通過函數指針的調用)
函數指針可以向後兼容 C 庫。
更可讀的錯誤信息。
function object
wrappers(函數對像包裝類)相當於一個成員函數指針加上兩個數據指針所組成的結構的大小。實際的大小依據不同的底層平台而有所不同;在32位
Mac OS X 的 GCC 上,大小為16字節,而在 Windows 的 Visual
C++ 上,則為32字節。另外,function object target(函數對像目標)可能分配在堆上,如果它不能被放入 boost::function 對象的小對像緩衝區中。
拷貝 function object wrappers(函數對像包裝類)可能需要為 function object
target(函數對像目標)的拷貝分配內存。缺省的分配器可以替換成一個更快的定制的分配器或者由於這個克隆的成本高得令人望而卻步,而可能選擇一個允
許 function object wrappers(函數對像包裝類)僅僅以引用方式(使用 ref)存儲 function object target(函數對像目標)的方式。小的函數對象可以被保存在 boost::function 對像本身中,以提高複製的效率。
在很多編譯器上虛擬函數的使用趨向於代碼膨脹。當一個類包含一個虛擬函數值,它必須發行一個額外的函數將對象的類型分類。根據我們的經驗,當使用了很多 boost::function 對像時,這些輔助函數對於可執行代碼大小的增加是值得注意的。
在 Boost.Function 中,一個可選且有效的方法是使用自由函數代替虛擬函數。Boost.Function 對像實際上持有兩個指針做一次合法的目標調用:一個指向它所包含的函數對象的 void 指針和一個指向可以調用這個函數對象的「調用者」的 void 指針,它給出函數指針。這個調用者函數執行 Boost.Function 提供的參數和返回值轉換。第三個指針指向一個被稱為「管理者」的函數,它處理函數對象的克隆和析構。這個方案是類型安全的,因為只有實際處理函數對象的函 數(調用者和管理者),被給定的函數對像類型實例化,所以它們可以安全地將輸入的 void 指針(函數對像指針)轉型為適當的類型。
Last revised: July 14, 2008 at 14:32:29 -0400 |
Copyright 2001-2004 Douglas Gregor |