От чего зависит размер объектного файла C ++? - PullRequest
9 голосов
/ 06 сентября 2011

Всякий раз, когда мы компилируем файл c ++, генерируется файл obj. Я хочу знать, что от каких факторов зависит размер файла obj?

Просто чтобы прояснить мой вопрос, Например, файл c ++ содержит объявление класса, и этот класс имеет 1 целочисленную переменную в качестве члена данных, а также имеет некоторые функции-члены. Если я скомпилирую этот файл, то будет создан некоторый файл obj некоторого размера X. Теперь предположим, что я добавлю больше членов данных и функций-членов, тогда изменится ли размер файла obj?

Ответы [ 3 ]

10 голосов
/ 06 сентября 2011

Это зависит от миллиона различных факторов и полностью зависит от платформы, компилятора и настроек.

Файл объекта должен содержать всю сборку для тел функций для функций с внешней связью, а также все глобальные переменные с внешней связью. Все, что связано с внутренней связью, может или не может требовать отдельной записи в объектном файле, поскольку они могли быть оптимизированы и интегрированы непосредственно в сайт вызовов. Это сильно зависит от настроек оптимизации.

GCC также имеет опцию «оптимизации времени ссылки», которая по существу добавляет копию всего исходного кода в объектный файл и значительно увеличивает его размер.

Символы отладки также добавляют много дополнительных данных.

Для вашего специфичного для C ++ вопроса: само определение класса на самом деле не видно в сборке. Не встроенные функции-члены - это просто дополнительные функции, которые должны быть скомпилированы, в то время как элементы данных просто обрабатываются так же, как примитивные члены-данные - они будут в стеке вызовов, если вы объявите экземпляры этого типа, но они не будут напрямую воздействовать на код сборки ... если вы не инициализируете вещи с помощью констант; Конечно, константы входят в код.

3 голосов
/ 06 сентября 2011

Объектный файл содержит (среди прочего) машинный код после компиляции исходного кода, но до его привязки.Поэтому размер объектного файла в основном зависит от сложности кода.

Большинство компиляторов предоставляют вам возможность добавлять символы отладки во время компиляции, чтобы упростить отладку, но увеличат размер вашего объектного файла.Вы можете добавить символы отладки с помощью опции -g и удалить их с помощью опции -s в GCC.Visual Studio имеет нечто подобное.

2 голосов
/ 06 сентября 2011

Это сильно зависит от компилятора, но.

Объектный файл будет содержать исполняемый код, заглушки связей и метаданные. Метаданные могут быть любыми компонентами, зависящими от компилятора, поэтому об этом не может быть и речи - с этим может случиться все, что угодно, в зависимости от того, что думает компилятор. Заглушки связей создаются для всех сущностей с внешней связью и для всех исходящих ссылок на сущности в других объектных файлах - на это напрямую не влияет добавление членов в класс в одном объектном файле.

Теперь закодируй. Когда вы добавляете переменную-член, она должна быть построена и уничтожена - для этого потребуется конструктор и деструктор, оба из которых могут быть тривиальными или нет. Если они не тривиальны, это приведет к незначительному увеличению размера кода, поскольку теперь необходимо что-то сделать для работы с этими переменными-членами, что требует дополнительного кода.

...