Почему g ++ хранит имена классов в скомпилированном бинарном файле? - PullRequest
11 голосов
/ 09 февраля 2011

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

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

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

Ответы [ 3 ]

13 голосов
/ 09 февраля 2011

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

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

4 голосов
/ 09 февраля 2011

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

3 голосов
/ 09 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...