Какие платформы не используют сравнение строк в 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 всегда сравнивает строки.

Какие платформы не сравнивают строки?

13
0
380
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

In libstdc++ it's controlled with __GXX_MERGED_TYPEINFO_NAMES

В более новых версиях gcc (с 23 июля 2009 г.) для этого макроса по умолчанию установлено значение 0.. Он всегда сначала сравнивает указатели, и если это не удается, выполняется полное сравнение строк. Глянь сюда:

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.

Примечательно, что это возможный для цели, чтобы переопределить это, но на самом деле ни одна цель не делает.

o11c 24.12.2018 20:02

@ o11c 3 цели перекрывают его: __GXX_MERGED_TYPEINFO_NAMES=0.

Maxim Egorushkin 24.12.2018 20:08

Эээ, верно, но они перезаписывают его до значения, которое у него уже есть.

o11c 24.12.2018 20:56

Другие вопросы по теме