Функция класса C ++ в сборке - PullRequest
1 голос
/ 07 февраля 2011

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

atomic_load_acq_ptr

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

_ZL19atomic_load_acq_intPVj

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

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

Ответы [ 4 ]

6 голосов
/ 07 февраля 2011

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

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

2 голосов
/ 07 февраля 2011

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

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

2 голосов
/ 07 февраля 2011

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

0 голосов
/ 07 февраля 2011

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

...