boost :: spirit :: hold_any如何工作?

时间:2012-11-10 10:15:50

标签: c++ boost-spirit

Evidently hold_any的效果优于boost::any。它是如何设法做到这一点的?

编辑:感谢Mat的评论,我在另一个问题上找到answer by hkaiser关于hold_any,但缺少详细信息。欢迎提供更详细的答案。

2 个答案:

答案 0 :(得分:1)

我认为其中一个原因是因为boost :: hold_any使用模板元编程方法,而boost :: any使用继承方法。

在内部,boost :: spirit :: hold_any使用void *存储“value”,并使用另一个对象来跟踪数据类型信息:

>> 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也应该更快。

答案 1 :(得分:1)

hold_any执行两项优化: 1.对于小对象,它不为对象持有者分配内存,而是直接将其存储在指针内存中; 2.它不使用RTTI类型比较(速度很慢),而是使用自己的类型表