프로그래밍 언어/C++

C ++ 컴파일이 오래 걸리는 이유

Rateye 2021. 7. 23. 11:36
728x90
반응형

 

질문 : 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
728x90
반응형