Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Miscellaneous Notes(雜項注記)

Boost.Function vs. Function Pointers(Boost.Function vs. 函數指針)
Performance(性能)
Combatting virtual function "bloat"(阻止虛擬函數「膨脹」)
Acknowledgements(感謝)

Boost.Function vs. Function Pointers(Boost.Function vs. 函數指針)

Boost.Function 有幾個超越函數指針的好處,即:

  • Boost.Function 允許任意的兼容函數對像作為目標(而不需要嚴格的函數識別標識)。

  • Boost.Function 可以和 argument-binding(參數綁定)及其它 function object construction libraries(函數對像構造庫)一起使用。

  • 當一個 empty function object(空函數對像)被調用時,Boost.Function 有可預期行為。

當然,函數指針也有幾個超越 Boost.Function 的好處:

  • 函數指針更小(只有一個指針而不是三個指針的大小)

  • 函數指針更快(Boost.Function 可能需要兩次通過函數指針的調用)

  • 函數指針可以向後兼容 C 庫。

  • 更可讀的錯誤信息。

Performance(性能)

Function object wrapper size(函數對像包裝類的大小)

function object wrappers(函數對像包裝類)相當於一個成員函數指針加上兩個數據指針所組成的結構的大小。實際的大小依據不同的底層平台而有所不同;在32位 Mac OS X 的 GCC 上,大小為16字節,而在 Windows 的 Visual C++ 上,則為32字節。另外,function object target(函數對像目標)可能分配在堆上,如果它不能被放入 boost::function 對象的小對像緩衝區中。

Copying efficiency(拷貝效率)

拷貝 function object wrappers(函數對像包裝類)可能需要為 function object target(函數對像目標)的拷貝分配內存。缺省的分配器可以替換成一個更快的定制的分配器或者由於這個克隆的成本高得令人望而卻步,而可能選擇一個允 許 function object wrappers(函數對像包裝類)僅僅以引用方式(使用 ref)存儲 function object target(函數對像目標)的方式。小的函數對象可以被保存在 boost::function 對像本身中,以提高複製的效率。

Invocation efficiency(調用效率)

使用一個徹底內聯的編譯器,對一個函數對象的調用需要一次通過函數指針的調用。如果這個調用是一個自由的函數指針,就必須有一次附加的調用以生成這個函數指針(除非編譯器具有非常強大的)進程間的分析能力。

Combatting virtual function "bloat"(阻止虛擬函數「膨脹」)

在很多編譯器上虛擬函數的使用趨向於代碼膨脹。當一個類包含一個虛擬函數值,它必須發行一個額外的函數將對象的類型分類。根據我們的經驗,當使用了很多 boost::function 對像時,這些輔助函數對於可執行代碼大小的增加是值得注意的。

在 Boost.Function 中,一個可選且有效的方法是使用自由函數代替虛擬函數。Boost.Function 對像實際上持有兩個指針做一次合法的目標調用:一個指向它所包含的函數對象的 void 指針和一個指向可以調用這個函數對象的「調用者」的 void 指針,它給出函數指針。這個調用者函數執行 Boost.Function 提供的參數和返回值轉換。第三個指針指向一個被稱為「管理者」的函數,它處理函數對象的克隆和析構。這個方案是類型安全的,因為只有實際處理函數對象的函 數(調用者和管理者),被給定的函數對像類型實例化,所以它們可以安全地將輸入的 void 指針(函數對像指針)轉型為適當的類型。

Acknowledgements(感謝)

很多人投身於此庫的構建。William Kempf,Jesse Jones 和 Karl Nelson 在隔絕此庫的接口和範圍中給予極大的幫助。John Maddock 主持了正式 review,很多 review 參與者給出了關於接口,實現和文檔的極好的意見。Peter Dimov 引導我們走向 function declarator-based(基於函數聲明符)的語法。

Last revised: July 14, 2008 at 14:32:29 -0400

Copyright 2001-2004 Douglas Gregor

PrevUpHomeNext