От чего зависит размер объектного файла C++?

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

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

3 ответов


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

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

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

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

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


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

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


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

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

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