От чего зависит размер объектного файла C++?
всякий раз, когда мы компилируем файл c++, создается файл obj. Я хочу знать, от каких факторов зависит размер файла obj?
просто, чтобы сделать мой вопрос более ясным, Например, файл c++ содержит объявление класса, и этот класс имеет 1 целочисленную переменную в качестве члена данных, а также некоторые функции-члены. Если я скомпилирую этот файл, то будет создан файл obj некоторого размера X. Теперь предположим, что я добавляю больше членов данных и функций-членов, тогда размер параметр obj изменить файл?
3 ответов
Это зависит от миллиона различных факторов и полностью зависит от платформы, компилятора и настроек.
объектный файл должен содержать всю сборку для органов функций для функций с внешней связью, а также все глобальные переменные с внешней связью. Что-либо с внутренней связью может или не может гарантировать отдельную запись в объектном файле, поскольку они могут быть оптимизированы и интегрированы непосредственно в их сайт вызовов. Это сильно зависит от параметры оптимизации.
GCC также имеет опцию "оптимизация времени связи", которая по существу добавляет копию всего исходного кода в объектный файл и значительно увеличивает его размер.
символы отладки также добавляют много дополнительных данных.
для вашего c++-конкретного вопроса: само определение класса на самом деле не отображается в сборке. Не-встроенные функции-члены - это просто больше функций, которые должны быть скомпилированы, в то время как члены данных просто обрабатываются то же самое, что и примитивные члены данных - они будут в стеке вызовов, если вы объявите экземпляры этого типа, но они не влияют непосредственно на код сборки ... если вы не инициализируете вещи константами; константы, конечно, входят в код.
объектный файл содержит (среди прочего) машинный код после компиляции источника, но до его связывания. Поэтому размер объектного файла в основном зависит от сложности кода.
большинство компиляторов дает вам возможность добавлять символы отладки во время компиляции, чтобы упростить отладку, но увеличит размер вашего объектного файла. Вы можете добавить символы отладки с помощью -g
опция и раздеть их с помощью -s
опция в GCC. Visual Studio имеет нечто подобное.
Это сильно зависит от компилятора, но.
объектный файл будет содержать исполняемый код, заглушки связей и метаданные. Метаданные могут быть любыми зависимыми от компилятора, поэтому об этом не может быть и речи - с ними может случиться все, что угодно, в зависимости от того, что думает компилятор. Заглушки связей создаются для всех сущностей с внешней связью и для всех исходящих ссылок на сущности в других объектных файлах, на которые непосредственно не влияет добавление членов в класс в том же объектный файл.
теперь код. Когда вы добавляете переменную-член, она должна быть построена и уничтожена - для этого потребуется конструктор и деструктор, которые могут быть тривиальными или нет. Если они не тривиальны, это приведет к небольшому росту размера кода, так как теперь необходимо сделать что-то дополнительное для работы с этими переменными-членами, и это требует дополнительного кода.