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

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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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