Jump to content

Единая единица компиляции

Единая единица компиляции ( 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, несмотря на то, что он из другого модуля.

См. также

[ редактировать ]
  1. ^ Разработчик, Unicorn (25 декабря 2017 г.). «Ускорение сборки проектов C и C++» . Середина . Проверено 16 марта 2022 г.
  2. ^ Краевски, Марек (31 января 2019 г.). Практическое высокопроизводительное программирование с помощью Qt 5: создавайте кроссплатформенные приложения с использованием параллелизма, параллельного программирования и управления памятью . Packt Publishing Ltd. ISBN  978-1-78953-330-9 .
  3. ^ Шах (19 мая 1992 г.). Практическая программная инженерия . ЦРК Пресс. п. 183. ИСБН  978-0-256-11454-6 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 219bc57c6c1a5de13a437c5033c668cf__1657306740
URL1:https://arc.ask3.ru/arc/aa/21/cf/219bc57c6c1a5de13a437c5033c668cf.html
Заголовок, (Title) документа по адресу, URL1:
Single compilation unit - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)