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