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

ami*_*mit 9 c++ boost-spirit

显然 hold_any有比...更好的表现boost::any.它是如何设法做到这一点的?

编辑:感谢Mat的评论,我找到了hkaiser关于hold_any另一个问题的答案,但缺乏细节.欢迎提供更详细的答案.

Hug*_*rrá 1

我认为原因之一是 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

boost::any 使用持有者存储“值”,并且不需要另一个对象来跟踪数据类型信息。持有者是从占位符继承的,因此具有继承缺点。

>> boost/any.hpp
class any
{
    ...
    placeholder * content;
    ...
}


class placeholder
template<typename ValueType>
class holder : public placeholder
{
    ...
    ValueType held;
    ...
}
Run Code Online (Sandbox Code Playgroud)

...性能差异更多地在于调用构造函数和析构函数,但即使对于转换, boost::spirit::hold_any 也应该更快。