哪些平台不在 type_info op== 中使用字符串比较?
Which platforms don't use string comparison in type_info op==?
这是type_info::operator==
的典型实现:
#if _PLATFORM_SUPPORTS_UNIQUE_TYPEINFO
bool operator==(const type_info& __rhs) const {
return __mangled_name == __rhs.__mangled_name;
}
#else
bool operator==(const type_info& __rhs) const {
return __mangled_name == __rhs.__mangled_name ||
strcmp(__mangled_name, __rhs.__mangled_name) == 0;
}
#endif
在 libstdc++ 中,它由 __GXX_MERGED_TYPEINFO_NAMES
、
控制
在 libc++ 中是 _LIBCPP_NONUNIQUE_RTTI_BIT
,
MSVC 总是比较字符串。
不比较字符串的平台有哪些?
In libstdc++ it's controlled with __GXX_MERGED_TYPEINFO_NAMES
In newer versions of gcc (since 23 Jul 2009) this macro is set to 0 by default. It always compares pointers first and if that fails they do the full string comparison. See here:
We used to do inline pointer comparison by default if weak symbols are available, but even with weak symbols sometimes names are not merged when objects are loaded with RTLD_LOCAL
, so now we always use strcmp
by default.
这是type_info::operator==
的典型实现:
#if _PLATFORM_SUPPORTS_UNIQUE_TYPEINFO
bool operator==(const type_info& __rhs) const {
return __mangled_name == __rhs.__mangled_name;
}
#else
bool operator==(const type_info& __rhs) const {
return __mangled_name == __rhs.__mangled_name ||
strcmp(__mangled_name, __rhs.__mangled_name) == 0;
}
#endif
在 libstdc++ 中,它由 __GXX_MERGED_TYPEINFO_NAMES
、
控制
在 libc++ 中是 _LIBCPP_NONUNIQUE_RTTI_BIT
,
MSVC 总是比较字符串。
不比较字符串的平台有哪些?
In libstdc++ it's controlled with
__GXX_MERGED_TYPEINFO_NAMES
In newer versions of gcc (since 23 Jul 2009) this macro is set to 0 by default. It always compares pointers first and if that fails they do the full string comparison. See here:
We used to do inline pointer comparison by default if weak symbols are available, but even with weak symbols sometimes names are not merged when objects are loaded with
RTLD_LOCAL
, so now we always usestrcmp
by default.