Единый блок компиляции - Single Compilation Unit

Единый блок компиляции (SCU) это компьютерное программирование техника для C и C ++ языков, что сокращает время компиляции программ, охватывающих несколько файлов. В частности, он позволяет компилятору сохранять данные из общих файлов заголовков, определений и шаблонов, так что ему не нужно воссоздавать их для каждого файла. Это пример оптимизация программы. Этот метод можно применить ко всей программе или к некоторому подмножеству исходных файлов; применительно ко всей программе он также известен как строить единство.

Цель

в Компиляция C / C ++ модель (формально «среда перевода»), индивидуальная .c/.cpp исходные файлы предварительно обрабатываются в единицы перевода, которые затем переводятся (составлен ) раздельно компилятором в несколько объектов (.o или же .obj) файлы. Затем эти объектные файлы могут быть связаны вместе для создания единого исполняемого файла или библиотеки. Однако это приводит к тому, что для общих файлов заголовков выполняется несколько проходов, а в C ++ - несколько экземпляров шаблона одного и того же шаблоны в разных единицах перевода.

В Единый блок компиляции Методика использует директивы препроцессора для «склеивания» различных единиц трансляции во время компиляции, а не во время компоновки. Это сокращает общее время сборки из-за исключения дублирования, но увеличивает время инкрементной сборки (время, необходимое после внесения изменений в любой отдельный исходный файл, который включен в единый модуль компиляции), из-за необходимости полной перестройки файла весь блок, если изменяется какой-либо отдельный входной файл. Следовательно, этот метод подходит для набора редко изменяемых исходных файлов со значительным перекрытием (много или дорогих общих заголовков или шаблонов) или исходных файлов, которые часто требуют перекомпиляции вместе, например, из-за того, что все они включают общий заголовок или шаблон, который часто изменяется. .

Еще одним недостатком SCU является то, что он является последовательным, компилируя все включенные исходные файлы последовательно в одном процессе и, следовательно, не может быть распараллелен, как это можно сделать при отдельной компиляции (через distcc или аналогичные программы). Таким образом, SCU требует явного разделения (ручное разделение или «сегментирование» на несколько блоков) для распараллеливания компиляции.

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

Пример

Например, если у вас есть исходные файлы foo.cpp и bar.cpp, они могут быть помещены в единый блок компиляции следующим образом:

#включают "foo.cpp"#включают "bar.cpp"

Предполагать foo.cpp и bar.cpp находятся:

//foo.cpp#включают <iostream> // Большой стандартный заголовок#включают "bar.h"    // Объявление функции barint главный()          // Определение функции main{   бар();}
//bar.cpp#включают <iostream> // Такой же большой стандартный заголовокпустота бар()          // Определение функции bar{  ...}

Теперь стандартный заголовочный файл (iostream) компилируется только один раз, а функция бар может быть встроен в функцию главный, несмотря на то, что он из другого модуля.

Смотрите также