단일 컴파일 유닛

Single Compilation Unit

싱글 컴파일 유닛(SCU)은 C 및 C++ 언어용 컴퓨터 프로그래밍 기술로 여러 파일에 걸친 프로그램의 컴파일 시간을 단축합니다.특히 컴파일러는 공유 헤더 파일, 정의 및 템플릿의 데이터를 유지할 수 있으므로 각 파일에 대해 데이터를 다시 작성할 필요가 없습니다.이것은 프로그램 최적화의 한 예입니다.이 기술은 전체 프로그램 또는 소스 파일의 일부 하위 집합에 적용할 수 있습니다. 전체 프로그램에 적용할 경우 유니티 [1]빌드라고도 합니다.

목적

C/C++ 컴파일 모델(공식적으로 "번역 환경")에서 개인은.c/.cpp 소스 파일은 변환 단위로 사전 처리되고 컴파일러에 의해 여러 객체(.o 또는 .obj) 파일로 따로 컴파일됩니다.그런 다음 이러한 개체 파일을 서로 연결하여 단일 실행 파일 또는 라이브러리를 생성할 수 있습니다.단, 이를 통해 공통 헤더파일에 대해 여러 패스가 실행되며 C++에서는 다른 변환 단위로 동일한 템플릿의 여러 템플릿 인스턴스화가 이루어집니다.

단일 컴파일 유닛 기술은 프리프로세서 명령을 사용하여 링크 시간이 아닌 컴파일 시 서로 다른 변환 유닛을 '접합'합니다.이것에 의해, 중복이 배제되기 때문에, 전체적인 빌드 시간이 단축됩니다만, 1 개의 입력 파일이 [2]변경되었을 경우는 유닛 전체를 완전하게 재구축 할 필요가 있기 때문에, 증분 빌드 시간(SCU 에 포함되는 1 개의 소스 파일을 변경한 후의 소요 시간)이 증가합니다.따라서 이 기술은 중복이 심한 자주 수정되지 않는 소스 파일 세트(다수 또는 고가의 공통 헤더 또는 템플릿) 또는 재컴파일이 자주 필요한 소스 파일(모두 공통 헤더 또는 템플릿이 자주 변경됨)[3]에 적합합니다.

SCU의 또 다른 단점은 포함된 모든 소스 파일을 1개의 프로세스로 순차적으로 컴파일하기 때문에 별도의 컴파일(distcc 또는 유사한 프로그램을 통해)로 병렬화할 수 없다는 것입니다.따라서 SCU는 컴파일을 병렬화하기 위해 명시적 분할(수동 분할 또는 여러 유닛으로 분할)이 필요합니다.

SCU는 또한 최적화 컴파일러가 링크 타임 최적화를 필요로 하지 않고 프로시저최적화를 실행할 수 있도록 하여 인라인 의 최적화를 가능하게 하고 예외, 부작용레지스터 할당에 의한 암묵적인 코드 블러트를 회피하는 데 도움이 됩니다.대부분의 컴파일러에서는 이러한 최적화는 컴파일 에 각 번역 유닛에서 개별적으로 이루어지기 때문에 대부분의 컴파일러에서는 불가능하지만 "덤 링커"는 최적화 자체를 수행하지 않고 오브젝트 파일을 링크합니다.따라서 번역 유닛 간의 프로시저 간 최적화는 불가능합니다.e.

예를 들어 소스 파일 foo.cpp bar.cpp가 있는 경우 다음과 같이 단일 컴파일 유닛에 배치할 수 있습니다.

#실패하다 "foo.cpp" #실패하다 "bar.cpp" 

foo.cpp와 bar.cpp는 다음과 같습니다.

//foo.cpp #실패하다 <iostream>// 큰 표준 헤더 #실패하다 "bar.h"// 함수 'bar' 선언  인트 주된()          // 함수 'main'의 정의 {    막대기(); } 
//bar.cpp #실패하다 <iostream>// 같은 큰 표준 헤더  무효 막대기()          // 함수 'bar'의 정의 {   ... } 

이제 표준 헤더 파일(iostream)는 1회만 컴파일되어 기능합니다.bar기능에 삽입할 수 있다main다른 모듈에서 온 경우에도 마찬가지입니다.

레퍼런스

  1. ^ Developer, Unicorn (2017-12-25). "Speeding up the Build of C and C++ Projects". Medium. Retrieved 2022-03-16.
  2. ^ Krajewski, Marek (2019-01-31). Hands-On High Performance Programming with Qt 5: Build cross-platform applications using concurrency, parallel programming, and memory management. Packt Publishing Ltd. ISBN 978-1-78953-330-9.
  3. ^ Schach (1992-05-19). Practical Software Engineering. CRC Press. p. 183. ISBN 978-0-256-11454-6.

「 」를 참조해 주세요.