提升::针对 C++11 的任何类型优化

boost::any typeid optimization for C++11

本文关键字:类型 优化 任何 C++11 针对 提升      更新时间:2023-10-16

可能的重复项:
typeid 何时可以为同一类型返回不同的type_info实例?

如果我将下面的operand->type() == typeid(ValueType)行更改为 &operand->type() == &typeid(ValueType) ,代码仍然可以使用 gcc 并且在可执行文件中占用更少的空间(并且多年来一直如此),但是 C++11 标准是否提供了任何保证,这种优化应该适用于不同的编译器?

template<typename ValueType>
ValueType * any_cast(any * operand)
{
    return operand && 
#ifdef BOOST_AUX_ANY_TYPE_ID_NAME
        std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0
#else
        operand->type() == typeid(ValueType)
#endif
        ? &static_cast<any::holder<ValueType> *>(operand->content)->held
        : 0;
}

不,不能保证。此断言可能会触发:

assert(&typeid(int) == &typeid(int));

虽然需要一个非常愚蠢的编译器来制造这种火灾,但它可能会发生。实际上,只有当跨动态库边界比较 typeid 时,它才会失败:

assert(&typeid_of_int_in_lib1() == &typeid_of_int_in_lib2());

这几乎肯定会触发。