https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59048
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Status|UNCONFIRMED |NEW Last reconfirmed|2013-11-08 00:00:00 |2017-05-19 CC| |msebor at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #16 from Martin Sebor <msebor at gcc dot gnu.org> --- Confirmed. I don't think the char* overload can ever match the string overload because the former has to compute the length of the char* argument and (possibly also) compare the strings, while the latter can avoid the first step because the lengths of both arguments are precomputed. But the char* overload can be sped up by avoiding string::compare which always traverses the strings, when operator== only has to do that if their lengths are the same. It also doesn't help that string::compare is not expanded inline (because std::string is declared extern). In my tests, the following definition speeds the operator up by a factor of 5, making it about 20% faster than strcmp: template<typename _CharT> inline bool operator==(const basic_string<_CharT>& __lhs, const _CharT* __rhs) { return !__lhs.compare (__rhs); typedef typename basic_string<_CharT>::size_type size_type; const size_type __len1 = __lhs.length (); const size_type __len2 = __builtin_strlen (__rhs); return __len1 == __len2 && !char_traits<_CharT>::compare (__lhs.data (), __rhs, __len1 < __len2 ? __len1 : __len2); }