Почему g++ хранит имена классов в скомпилированном двоичном файле?

Я заметил, что если я запускаю strings в своей программе, которая была скомпилирована g++, вывод содержит имена различных классов, которые он использует.

Программа была скомпилирована с -O3 и без -g или -p, и имена классов все еще присутствуют, когда я удаляю двоичный файл.

Мне было интересно, зачем g++ хранить эту информацию в бинарнике? Все присутствующие имена классов кажутся классами, использующими виртуальные функции, поэтому я подозреваю, что это как-то связано с этим.


person Xeno    schedule 09.02.2011    source источник
comment
Точка отсчета: использование g++ -c blah.o blah.cpp не включает имена классов до тех пор, пока оно не будет связано как исполняемый файл.   -  person Matt K    schedule 09.02.2011


Ответы (3)


Это может быть связано с RTTI, в частности, RTTI позволяет запрашивать имя класса данной переменной. См. ключевое слово typeid. Если это так, то это объясняет, почему это происходит только с классами с виртуальными функциями — RTTI работает только с классами с виртуальными функциями.

Редактировать: Как указал @xeno, это действительно RTTI, и если вы добавите -fno-rtti, имена классов не появятся в выводе строк.

person sashoalm    schedule 09.02.2011
comment
Да, это похоже на RTTI, я снова скомпилировал с -fno-rtti, и имена классов не отображаются в выводе строк. - person Xeno; 09.02.2011
comment
@Xeno: gcc возвращает искаженное имя класса, когда вы используете typeid(x).name(). - person Matthieu M.; 09.02.2011
comment
Я только что скомпилировал свой код с -fno-rtti и все еще вижу имена функций в выводе строк... - person ancajic; 19.04.2018
comment
Я не уверен в этом, но имена функций могут не совпадать с именами классов. - person sashoalm; 19.04.2018

g++ по умолчанию включает RTTI. Используйте переключатель -fno-rtti, если вам не нужен RTTI, и вы обнаружите, что строки отсутствуют.

person Steve    schedule 09.02.2011
comment
обратите внимание, что отключение RTTI обычно также отключает исключения, поскольку RTTI и обработка исключений обычно имеют ряд общих механизмов. - person Matthieu M.; 09.02.2011

Да, вероятно, это связано с тем, как g++ реализует RTTI. Он должен иметь возможность искать нужный тип в дереве классов во время выполнения, поэтому он должен каким-то образом хранить это дерево. Любой класс с виртуальной функцией считается «полиморфным» и требует включения в исполняемый файл специальной информации RTTI. Стандарт не говорит, как это делается, но имена классов имеют такой же смысл, как и все остальное.

person Edward Strange    schedule 09.02.2011
comment
на самом деле это не требует сохранения имени, только идентификатора. Хэш, например, тоже подойдет. - person Matthieu M.; 09.02.2011
comment
Хорошо, что я никогда не утверждал, что это так. - person Edward Strange; 10.02.2011