Почему связано много объектных файлов, а не один большой объектный файл?

Почему скомпилированные языки программирования (например, C++) настроены на создание множества объектных файлов, которые связаны друг с другом, а не один большой объект?

Например (написано на C++, может применяться к любому скомпилированному языку), рассмотрим два файла в проекте main.cpp и auxiliary.cpp. В чем разница между main.cpp и auxiliary.cpp, скомпилированными в main.o и auxiliary.o, а затем связанными с main.exe, и main.cpp с #include auxiliary.cpp, скомпилированными только в main.o и связанными с main.exe? Насколько мне известно, они, по крайней мере, поверхностно дадут тот же результат.

Я вижу необходимость в нескольких объектах в случае многоязычных проектов, но не иначе. Дает ли несколько объектов компоновщику больше гибкости при создании исполняемого файла?


person Brendon Boldt    schedule 19.06.2014    source источник
comment
Как бы вы нашли что-то в одном файле cpp длиной в несколько сотен тысяч строк, содержащем тысячи классов? Также, когда я меняю 1 строку, я бы не хотел ждать 1 час для компиляции.   -  person drescherjm    schedule 19.06.2014
comment
При использовании команды препроцессора #include исходный код будет находиться во многих файлах для пользователя, но будет выглядеть как один файл для компилятора.   -  person Brendon Boldt    schedule 19.06.2014
comment
Это будет страдать от излишне долгого времени компиляции.   -  person drescherjm    schedule 19.06.2014


Ответы (3)


Подобные отдельные единицы компиляции ускоряют компиляцию. Если вы вносите изменения в auxilliary.cpp, компилятору нужно только воссоздать auxilliary.o, а не перекомпилировать все. Это становится особенно важным, чем больше проект.

person Code-Apprentice    schedule 19.06.2014

На это я могу ответить риторическим вопросом: почему вы пишете много функций вместо одной большой?

Та же логика применяется на уровне ссылки.

person Lightness Races in Orbit    schedule 19.06.2014

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

Теперь подумайте, действительно ли то, о чем вы спрашиваете, имеет смысл: если бы нужно было создать один файл .o, ему пришлось бы объединять результаты компиляции каждого cpp в этот двоичный файл по мере его создания, эффективно оплачивая стоимость связывания нескольких раз. Кроме того, изменение одной единицы перевода потребует, чтобы компилятор вычислил, какие символы в большом объектном файле взяты из исходной версии этой единицы перевода, удалил их из объекта и добавил новые после перестроения.

person David Rodríguez - dribeas    schedule 19.06.2014