Evidentlyhold_any
比boost::any
有更好的性能。它如何設法做到這一點?boost :: spirit :: hold_any如何工作?
編輯:感謝馬特的評論,我發現一個answer by hkaiser約hold_any
在另一個問題,但它缺乏細節。更詳細的答案將受到歡迎。
Evidentlyhold_any
比boost::any
有更好的性能。它如何設法做到這一點?boost :: spirit :: hold_any如何工作?
編輯:感謝馬特的評論,我發現一個answer by hkaiser約hold_any
在另一個問題,但它缺乏細節。更詳細的答案將受到歡迎。
我認爲其中一個原因是因爲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應該會更快。
hold_any做了兩項優化: 1.對於小對象,它不爲對象持有者分配內存,而是直接將其存儲在指針內存中; 2.它不使用RTTI類型比較(這是慢),但使用自己的類型表
你讀過從該文章鏈接堆棧溢出帖子? – Mat
您是否聽說過在價值語義僞指針類的上下文中的「小對象優化慣用法」,比如std string? – Yakk