Функция класса C++ в сборке

Здравствуйте, сообщество! Я смотрю на ассемблер C++, я скомпилировал эталонный тест из пакета PARSEC, и мне трудно понять, как они называют функции атрибутов класса на ассемблере. например, если у меня есть класс с некоторыми функциями для управления им, в cpp мы называем их как test.increment(); После некоторого расследования я обнаружил, что эта функция

atomic_load_acq_ptr

представлен как:

_ZL19atomic_load_acq_intPVj

в сборке, или, по крайней мере, это то, что я узнал.

Дайте мне знать, если я ошибаюсь! Есть ли какое-то фиксированное правило для сопоставления? или они случайные? Спасибо

4 ответа

Решение

Это называется искажение имени, это необходимо из-за перегрузок и шаблонов и тому подобного (то есть простого имени символов и цифр недостаточно для однозначной идентификации фрагмента кода; встраивание пробелов или <> или же :: в именах обычно не легально; копирование дополнительной информации в несконденсированной, удобочитаемой форме было бы расточительным), и, следовательно, это зависит от типов, арности и т. д.

Точная схема может варьироваться, но обычно каждый компилятор самосогласован в течение относительно длительного времени (иногда даже несколько компиляторов могут согласиться на один способ).

Это называется искажение имени., Это зависит от компилятора. Нет стандартного способа, извините:)

C++ допускает перегрузку функций, это означает, что можно иметь две функции с одинаковым именем, но разными параметрами. Поскольку ваши двоичные форматы не понимают тип, это проблема. Способ обойти это - использовать схему, называемую искажение имени. Это добавляет целую функцию информации о типе к имени, используемому в исходном файле, и обеспечивает правильную перегрузку.

Добавляемые дополнительные буквы и т. Д. Определяются конкретным используемым двоичным интерфейсом приложения (ABI). Разные компиляторы (а иногда даже разные версии) могут использовать разные ABI.

Да, есть стандартный метод для создания этих символов, известный как искажение имени.

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