Почему g++ хранит имена классов в скомпилированном двоичном файле?
Я заметил, что если я запустил strings
в моей программе, которая была скомпилирована g++
, то вывод содержит имена различных классов, которые он использует.
Программа была скомпилирована с помощью -O3
и без -g
или -p
, а имена классов все еще присутствуют, когда я разбиваю двоичный файл.
Мне было интересно, зачем нужно g++
хранить эту информацию в двоичном формате? Имена классов, которые присутствуют, кажутся классами, которые используют виртуальные функции, поэтому я подозреваю, что это связано с этим.
Ответы
Ответ 1
Это может иметь какое-то отношение к RTTI, в частности, RTTI позволяет запросить имя класса данной переменной. См. typeid. Если это так, то это объясняет, почему это происходит только с классами, которые имеют виртуальные функции - RTTI работает только для классов с виртуальными функциями.
Ответ 2
g++ по умолчанию включен RTTI. Используйте переключатель -fno-rtti, если вам не нужен RTTI, и вы обнаружите, что строки отсутствуют.
Ответ 3
Да, вероятно, это связано с тем, как g++ реализует RTTI. Он должен иметь возможность искать дерево классов для правильного типа во время выполнения, поэтому он должен каким-то образом сохранить это дерево. Любой класс с виртуальной функцией считается "полиморфным" и требует, чтобы в исполняемый файл включалась специальная информация RTTI. В стандарте не сказано, как это делается, но имена классов имеют почти такое же значение, как и все.