Единая единица компиляции
Эта статья дублирует сферу применения других статей , в частности, сборки Unity . . ( апрель 2022 г. ) |
Эта статья может быть слишком технической для понимания большинства читателей . ( Март 2022 г. ) |
Единая единица компиляции ( SCU ) — это метод компьютерного программирования для языков C и C++ , который сокращает время компиляции программ, охватывающих несколько файлов. В частности, это позволяет компилятору сохранять данные из общих файлов заголовков, определений и шаблонов, так что ему не нужно воссоздавать их для каждого файла. Это пример оптимизации программы . Этот метод можно применить ко всей программе или к некоторому подмножеству исходных файлов; применительно ко всей программе он также известен как единая сборка . [1]
Цель
[ редактировать ]В модели компиляции C/C++ (формально «среда перевода») отдельные .с / Исходные файлы .cpp предварительно обрабатываются в единицы перевода , которые затем отдельно компилируются компилятором в несколько объектов ( .о или .obj ) файлы. Эти объектные файлы затем можно соединить вместе для создания одного исполняемого файла или библиотеки. Однако это приводит к выполнению нескольких проходов для общих файлов заголовков, а в C++ — к множественным экземплярам одних и тех же шаблонов в разных единицах перевода.
Метод единой единицы компиляции использует директивы препроцессора для «склеивания» различных единиц трансляции во время компиляции, а не во время компоновки. Это сокращает общее время сборки за счет устранения дублирования, но увеличивает время дополнительной сборки (время, необходимое после внесения изменений в любой отдельный исходный файл, включенный в SCU), поскольку требуется полная перестройка всего модуля. если какой-либо входной файл изменится. [2] Таким образом, этот метод подходит для набора редко изменяемых исходных файлов со значительным перекрытием (многие или дорогостоящие общие заголовки или шаблоны) или исходных файлов, которые часто требуют совместной перекомпиляции, например, из-за того, что все они включают общий заголовок или шаблон, который часто меняется. . [3]
Еще одним недостатком SCU является то, что он является последовательным, компилируя все включенные исходные файлы последовательно в одном процессе, и поэтому не может быть распараллелен, как это можно сделать при раздельной компиляции (через distcc или подобные программы). Таким образом, SCU требует явного разделения (ручного разделения или «шардинга» на несколько модулей) для распараллеливания компиляции.
SCU также позволяет оптимизирующему компилятору выполнять межпроцедурную оптимизацию, не требуя оптимизации во время компоновки , что позволяет использовать такие оптимизации, как встраивание , и помогает избежать неявного раздувания кода из-за исключений , побочных эффектов и распределения регистров . Эти оптимизации часто невозможны во многих компиляторах из-за независимой компиляции, где оптимизация происходит отдельно в каждой единице трансляции во время компиляции, но «тупой компоновщик» просто связывает объектные файлы, не выполняя никаких оптимизаций самостоятельно, и, следовательно, межпроцедурную оптимизацию между единицами трансляции. невозможно.
Пример
[ редактировать ]Например, если у вас есть исходные файлы foo.cpp и bar.cpp , их можно поместить в единый модуль компиляции следующим образом:
#include "foo.cpp"
#include "bar.cpp"
Предполагать foo.cpp и bar.cpp — это:
//foo.cpp
#include <iostream> // A large, standard header
#include "bar.h" // Declaration of function 'bar'
int main() // Definition of function 'main'
{
bar();
}
//bar.cpp
#include <iostream> // The same large, standard header
void bar() // Definition of function 'bar'
{
...
}
Теперь стандартный заголовочный файл ( iostream
) компилируется только один раз, и функция bar
может быть встроен в функцию main
, несмотря на то, что он из другого модуля.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Разработчик, Unicorn (25 декабря 2017 г.). «Ускорение сборки проектов C и C++» . Середина . Проверено 16 марта 2022 г.
- ^ Краевски, Марек (31 января 2019 г.). Практическое высокопроизводительное программирование с помощью Qt 5: создавайте кроссплатформенные приложения с использованием параллелизма, параллельного программирования и управления памятью . Packt Publishing Ltd. ISBN 978-1-78953-330-9 .
- ^ Шах (19 мая 1992 г.). Практическая программная инженерия . ЦРК Пресс. п. 183. ИСБН 978-0-256-11454-6 .