Ben*_*nRI 2 c++ performance boost typeid boost-any
它看起来像调用boost::any_cast<T>(any&)一些昂贵的类型检查以确保转换有效.具体来说,它调用执行以下测试以确保演员合法:
std :: strcmp(operand-> type().name(),typeid(ValueType).name())== 0
如果强制转换是合法的,则代码执行static_cast.
这对于调试模式似乎很有用,但对于生产代码来说却相当慢.有没有办法跳过strcmp?
boost::any包括一组未记录的ValueType * unsafe_any_cast(any * operand)函数,它们可以为any*操作数执行所需的操作.
您可以获取引用的地址以获得所需内容,或者由于Boost是开源的,您可以在一组这些函数模板中进行修补以获取any&操作数.
然后创建一个包装器,它使用调试版本中的安全版本和发布版本中的不安全版本.但是,我至少还要进行一次添加 - 调试包装器应该捕获为无效转换抛出的异常并调用调试器或使程序崩溃,以便在调试模式下运行时,这些无效的转换不会以某种方式处理隐藏了发布版本具有未定义行为的事实.
另请注意,Boost保留删除不安全版本的权利:
// Note: The "unsafe" versions of any_cast are not part of the
// public interface and may be removed at any time.
Run Code Online (Sandbox Code Playgroud)
因此,如果您决定使用这些功能(或补丁any.hpp来扩展它们),那么您将购买某种程度的维护义务,这些义务可能会或可能不会被接受,具体取决于您的代码可以交付给谁.