2012-11-10 52 views
9

Evidentlyhold_anyboost::any有更好的性能。它如何設法做到這一點?boost :: spirit :: hold_any如何工作?

編輯:感謝馬特的評論,我發現一個answer by hkaiserhold_any在另一個問題,但它缺乏細節。更詳細的答案將受到歡迎。

+0

你讀過從該文章鏈接堆棧溢出帖子? – Mat

+1

您是否聽說過在價值語義僞指針類的上下文中的「小對象優化慣用法」,比如std string? – Yakk

回答

1

我認爲其中一個原因是因爲boost :: hold_any使用了模板元編程方法,而boost :: any使用了繼承方法。

內部,升壓::精神:: hold_any存儲「值」使用一個void *,並使用另一個目的是爲了記錄數據類型信息的:

>> boost/spirit/home/support/detail/hold_any.hpp 
template <typename Char> 
class basic_hold_any 
{ 
    .... 
    spirit::detail::fxn_ptr_table<Char>* table; 
    void* object; 
    ... 
} 

的boost ::任何商店的「值「使用持有者,並且不需要另一個對象來跟蹤數據類型信息。持有者從佔位符繼承,因此具有遺傳缺陷。

>> boost/any.hpp 
class any 
{ 
    ... 
    placeholder * content; 
    ... 
} 


class placeholder 
template<typename ValueType> 
class holder : public placeholder 
{ 
    ... 
    ValueType held; 
    ... 
} 

...演出]不同的是更多關於調用構造函數和析構函數,但即使鑄件,提振精神:: :: hold_any應該會更快。

1

hold_any做了兩項優化: 1.對於小對象,它不爲對象持有者分配內存,而是直接將其存儲在指針內存中; 2.它不使用RTTI類型比較(這是慢),但使用自己的類型表