【发布时间】:2012-05-16 22:57:46
【问题描述】:
看起来对boost::any_cast<T>(any&) 的调用调用了一些昂贵的类型检查以确保强制转换有效。具体来说,它调用执行以下测试以确保强制转换是合法的:
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