질문 : C ++ 컴파일이 왜 그렇게 오래 걸리나요?
C ++ 파일을 컴파일하는 것은 C # 및 Java와 비교할 때 매우 오래 걸립니다. 일반적인 크기의 Python 스크립트를 실행하는 것보다 C ++ 파일을 컴파일하는 데 훨씬 더 오래 걸립니다. 현재 VC ++를 사용하고 있지만 모든 컴파일러와 동일합니다. 왜 이런거야?
내가 생각할 수있는 두 가지 이유는 헤더 파일을로드하고 전처리기를 실행하는 것이었지만 그것이 왜 그렇게 오래 걸리는지 설명 할 수없는 것 같습니다.
답변
몇 가지 이유
헤더 파일
모든 단일 컴파일 단위에는 수백 또는 수천 개의 헤더가 (1)로드되고 (2) 컴파일되어야합니다. 전처리 기가 헤더 컴파일 결과가 모든 컴파일 단위마다 다를 수 있도록 보장하기 때문에 일반적으로 모든 컴파일 단위를 모든 컴파일 단위에 대해 다시 컴파일해야합니다. (헤더의 내용을 변경하는 하나의 컴파일 단위에 매크로를 정의 할 수 있습니다.)
이 모든 컴파일 단위에 대해 컴파일하는 코드의 엄청난 양을 필요로하며, 또한, 모든 헤더는 (를 포함 모든 컴파일 단위에 대해 한 번) 여러 번 컴파일되어야한다 이것은 아마도 주된 이유입니다.
연결
일단 컴파일되면 모든 개체 파일을 함께 연결해야합니다. 이것은 기본적으로 병렬화가 잘되지 않으며 전체 프로젝트를 처리해야하는 모 놀리 식 프로세스입니다.
구문 분석
구문은 구문 분석하기가 매우 복잡하고 컨텍스트에 크게 의존하며 명확하게하기가 매우 어렵습니다. 이것은 많은 시간이 걸립니다.
템플릿
C #에서 List<T>
는 프로그램에있는 List 인스턴스화 수에 관계없이 컴파일되는 유일한 형식입니다. C ++에서 vector<int>
vector<float>
와 완전히 분리 된 유형이며 각각 별도로 컴파일해야합니다.
여기에 템플릿이 컴파일러가 해석해야하는 완전한 Turing-complete "하위 언어"를 구성한다는 점을 추가하면 이것은 엄청나게 복잡해질 수 있습니다. 비교적 간단한 템플릿 메타 프로그래밍 코드도 수십 개의 템플릿 인스턴스화를 생성하는 재귀 템플릿을 정의 할 수 있습니다. 템플릿은 또한 이름이 엄청나게 긴 매우 복잡한 유형을 생성하여 링커에 많은 추가 작업을 추가 할 수 있습니다. (많은 기호 이름을 비교해야하며 이러한 이름이 수천 개의 문자로 자랄 수 있다면 상당히 비쌀 수 있습니다).
물론 템플릿은 일반적으로 헤더에 정의되어야하므로 모든 컴파일 단위에 대해 훨씬 더 많은 코드를 구문 분석하고 컴파일해야하기 때문에 헤더 파일의 문제를 악화시킵니다. 일반 C 코드에서 헤더는 일반적으로 포워드 선언 만 포함하지만 실제 코드는 거의 없습니다. C ++에서 거의 모든 코드가 헤더 파일에 상주하는 것은 드문 일이 아닙니다.
최적화
C ++는 매우 극적인 최적화를 허용합니다. C # 또는 Java는 클래스가 완전히 제거되는 것을 허용하지 않지만 (반영 목적을 위해 있어야 함) 단순한 C ++ 템플릿 메타 프로그램도 수십 또는 수백 개의 클래스를 쉽게 생성 할 수 있으며,이 모든 클래스는 최적화에서 인라인되고 다시 제거됩니다. 단계.
또한 C ++ 프로그램은 컴파일러에 의해 완전히 최적화되어야합니다. AC # 프로그램은 JIT 컴파일러를 사용하여로드시 추가 최적화를 수행 할 수 있습니다. C ++는 이러한 "두 번째 기회"를 얻지 못합니다. 컴파일러가 생성하는 것은 최대한 최적화되어 있습니다.
머신
C ++는 바이트 코드 Java 또는 .NET 사용 (특히 x86의 경우)보다 다소 복잡 할 수있는 기계 코드로 컴파일됩니다. (이것은 주석 등에 언급 되었기 때문에 완전성으로 언급되었습니다. 실제로이 단계는 총 컴파일 시간의 아주 작은 부분 이상을 차지하지 않을 것입니다).
결론
이러한 요소의 대부분은 실제로 상당히 효율적으로 컴파일되는 C 코드에서 공유됩니다. 구문 분석 단계는 C ++에서 훨씬 더 복잡하고 훨씬 더 많은 시간이 소요될 수 있지만 주범은 아마도 템플릿 일 것입니다. 그것들은 유용하고 C ++를 훨씬 더 강력한 언어로 만들지 만 컴파일 속도 측면에서도 큰 타격을받습니다.
출처 : https://stackoverflow.com/questions/318398/why-does-c-compilation-take-so-long
'프로그래밍 언어 > C++' 카테고리의 다른 글
gcc의 C / C ++ 소스에서 assembler output 얻는 방법 (0) | 2021.07.27 |
---|---|
C ++ 표준 int, long 유형의 크기 기준 (0) | 2021.07.27 |
Collatz 추측을 테스트하기위한 C ++ 코드가 손으로 작성한 어셈블리보다 빠르게 실행되는 이유 (0) | 2021.07.23 |
C ++ 프로그래머가 'new'사용을 최소화해야하는 이유 (0) | 2021.07.23 |
확실한 C ++ 의 가이드 및 목록 (0) | 2021.07.23 |