Я делаю некоторые C ++ разборки с IDA Pro. Но я часто вижу подобные линии.
call __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc ;std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const*)
О чем эти глифы? Почему функция C ++ выглядит такой сложной? И как я могу упростить мой ASM. Заранее спасибо.
C ++ гарантирует, что перегруженные функции могут быть определены компоновщиком по коверкание их имена. То, что вы видите, это информация о типе, закодированная в искаженном имени функции.
Это функция вывода для (например)
cout << "something";
std::operator<<
это имя функции. Требуется std::basic_ostream<char, std::char_traits<char>>&
аргумент — другими словами, std::ostream
Второй аргумент char const *
другими словами, классическая строка в стиле C, которая не должна меняться.
поскольку operator<<
также возвращает std::ostream&
это закодировано перед именем
Это «сложно», потому что его легче определить, шаблонное, basic_ostream
так как существуют различные типы потоков, такие как owstream
который принимает «широкие символы», полезно иметь шаблон basic_ostream
который может быть создан для формирования std::ostream
чем реализовать несколько разных, по сути, одинаковых потоковых классов.