【问题标题】:How does boost::spirit::hold_any work?boost::spirit::hold_any 是如何工作的?
【发布时间】:2012-10-30 13:03:42
【问题描述】:

Evidentlyhold_any 的性能优于boost::any。它是如何做到这一点的?

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

【问题讨论】:

  • 您是否阅读了该文章链接的 Stack Overflow 帖子?
  • 你听说过值语义伪指针类上下文中的“小对象优化习语”吗,比如std string?

标签: c++ boost-spirit


【解决方案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;
    ...
}

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

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


class placeholder
template<typename ValueType>
class holder : public placeholder
{
    ...
    ValueType held;
    ...
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多