【问题标题】:Can boost::any_cast<double>(any&) be sped up?boost::any_cast<double>(any&) 可以加速吗?
【发布时间】:2012-05-16 22:57:46
【问题描述】:

看起来对boost::any_cast&lt;T&gt;(any&amp;) 的调用调用了一些昂贵的类型检查以确保强制转换有效。具体来说,它调用执行以下测试以确保强制转换是合法的:

std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0

如果转换是合法的,那么代码会执行一个 static_cast。

这对于调试模式似乎很有用,但对于生产代码来说却相当慢。有什么办法可以跳过strcmp?

【问题讨论】:

  • 如果你禁用boost::any 中的类型检查,它与仅使用void * 并自己进行转换有什么区别?
  • @ildjarn:没错,但我认为他的意思是在类型安全方面。 boost::any 的全部意义在于防止任何人将其转换为错误的类型,但提问者似乎在问如何不这样做。只是不要使用boost::any
  • 如果类型检查仅被禁用 #ifdef NDEBUG 或 #ifdef BOOST_ANY_NO_TYPE_CHECK,那么 boost::any 不会保留一些有用性?
  • @BenRI :也许吧,但我不认为推广简单的 UB 是 Boost.Any 的设计目标之一。 ;-]
  • @BenRI:你是什么意思保留一些有用性?它非常有用。说“这对我不起作用,所以对每个人都没用”是相当傲慢的。也许是您的程序设计错误。就像其他人所说的那样,重点是类型安全。不需要吗?不要使用boost::any

标签: c++ performance boost typeid boost-any


【解决方案1】:

boost::any 包含一组未记录的 ValueType * unsafe_any_cast(any * operand) 函数,它们可以为 any* 操作数执行您想要的操作。

您可以获取引用的地址来获取所需的内容,或者由于 Boost 是开源的,您可以修补一组这些函数模板以获取 any&amp; 操作数。

然后制作一个包装器,在调试版本中使用安全版本,在发布版本中使用不安全版本。但是,我至少要进一步添加 - 调试包装器应该捕获为无效转换引发的异常并调用调试器或使程序崩溃,以便在调试模式下运行时不会以某种方式处理这些无效转换隐藏发布版本将具有未定义行为的事实。

另外请记住,Boost 保留删除不安全版本的权利:

// Note: The "unsafe" versions of any_cast are not part of the
// public interface and may be removed at any time.

因此,如果您决定使用这些功能(或修补 any.hpp 以扩展它们),您将承担一定程度的维护义务,这可能会或可能不会接受,具体取决于您的代码可能交付给谁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多