2012-11-10 53 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类型比较(这是慢),但使用自己的类型表