显然 hold_any
比boost::any
. 它是如何做到这一点的?
编辑:感谢 Mat 的评论,我在另一个问题上找到了hkaiser 的答案,但hold_any
它缺乏细节。欢迎提供更详细的答案。
显然 hold_any
比boost::any
. 它是如何做到这一点的?
编辑:感谢 Mat 的评论,我在另一个问题上找到了hkaiser 的答案,但hold_any
它缺乏细节。欢迎提供更详细的答案。
我认为原因之一是因为 boost::hold_any 使用模板元编程方法,而 boost::any 使用继承方法。
在内部, boost::spirit::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::any 使用持有者存储“值”,它不需要另一个对象来跟踪数据类型信息。持有者是从占位符继承的,因此具有继承的缺点。
>> boost/any.hpp
class any
{
...
placeholder * content;
...
}
class placeholder
template<typename ValueType>
class holder : public placeholder
{
...
ValueType held;
...
}
...性能差异更多地在于调用构造函数和析构函数,但即使对于强制转换, boost::spirit::hold_any 也应该更快。
hold_any 做了两个优化: 1. 对于小对象,它不为对象持有者分配内存,而是直接存储在指针内存中;2.不使用RTTI类型比较(比较慢)而是使用自己的类型表