Начнем с того, что GCC следует Itanium C ++ ABI .
Согласно ABI, искаженное имя для ваш Thing::foo()
легко разбирается:
_Z | N | 5Thing | 3foo | E | v
prefix | nested | `Thing` | `foo`| end nested | parameters: `void`
Вы можете прочитать имена конструкторов аналогично, как показано ниже. Обратите внимание, что конструктор «name» не указан, но вместо этого C
:
_Z | N | 5Thing | C1 | E | i
prefix | nested | `Thing` | Constructor | end nested | parameters: `int`
Но что это C1
? Ваш дубликат имеет C2
. Что это означает ?
Ну, это тоже довольно просто :
::= C1 # complete object constructor
::= C2 # base object constructor
::= C3 # complete object allocating constructor
::= D0 # deleting destructor
::= D1 # complete object destructor
::= D2 # base object destructor
Подождите, почему это простой ? Этот класс не имеет базы. Почему у него есть «полный конструктор объекта» и «конструктор базового объекта» для каждого?
c++filt
используется для включения этой информации в ее демонтированный вывод, , но больше не работает . Фактически это указано как «известная проблема» GCC :
G ++ испускает две копии конструкторов и деструкторов.
В общем случае существуют три типа конструкторов (и деструкторов).
- Полный конструктор объекта / destructor.
- Конструктор / деструктор базового объекта.
- Выделение конструктора / дезактивация деструктора.
Первые два отличаются друг от друга, когда виртуальная база классы
blockquote>Значение этих разных конструкторов выглядит следующим образом :
- «Полный объект-конструктор ". Он дополнительно создает виртуальные базовые классы.
- «Конструктор базового объекта». Он создает сам объект, а также элементы данных и не виртуальные базовые классы.
- «Назначение конструктора объектов». Он делает все, что делает полный конструктор объектов, а также вызывает новый оператор для фактического выделения памяти ... , но, видимо, это обычно не видно.
Если у вас нет виртуальных базовых классов, [первые два] идентичны; GCC будет на достаточных уровнях оптимизации фактически называть символы для одного и того же кода для обоих.
blockquote>