다음을 통해 공유


헤더 단위, 모듈 및 미리 컴파일된 헤더 비교

지금까지는 표준 라이브러리를 다음과 같은 #include <vector>지시문과 함께 포함했습니다. 그러나 헤더 파일이 포함된 모든 소스 파일에서 다시 처리되므로 헤더 파일을 포함하는 데 비용이 많이 듭니다.

미리 컴파일된 헤더(PCH)는 컴파일 속도를 한 번 변환하고 결과를 다시 사용하여 도입되었습니다. 그러나 미리 컴파일된 헤더는 유지 관리하기 어려울 수 있습니다.

C++20에서는 모듈이 헤더 파일 및 미리 컴파일된 헤더에서 크게 개선되었습니다.

헤더 단위는 헤더 파일과 모듈 간의 간격을 일시적으로 해소하기 위한 방법으로 C++20에서 도입되었습니다. 모듈을 사용하도록 코드를 마이그레이션하는 동안 모듈의 속도와 견고성 이점을 제공합니다.

그런 다음, C++23 표준 라이브러리는 표준 라이브러리를 명명된 모듈로 가져오기 위한 지원을 도입했습니다. 표준 라이브러리를 사용하는 가장 빠르고 강력한 방법입니다.

다양한 옵션을 정렬하는 데 도움이 되도록 이 문서에서는 기존의 #include 메서드를 미리 컴파일된 헤더, 헤더 단위 및 명명된 모듈 가져오기와 비교합니다.

다음 표는 컴파일러 처리 속도와 견고성으로 정렬되며 가장 #include 느리고 가장 강력하며 import 가장 빠르고 강력합니다.

메서드 요약
#include 한 가지 단점은 매크로 및 내부 구현을 노출한다는 것입니다. 내부 구현은 종종 밑줄로 시작하는 함수 및 형식으로 노출됩니다. 이는 내부 구현의 일부이며 사용해서는 안 됨을 나타내는 규칙입니다.

헤더 파일은 #includes 순서가 동작을 수정하거나 코드를 끊을 수 있고 매크로 정의의 영향을 받을 수 있기 때문에 취약합니다.

헤더 파일의 컴파일 속도가 느립니다. 특히 헤더 파일이 여러 번 다시 처리되므로 여러 파일에 동일한 파일이 포함되어 있는 경우
미리 컴파일된 헤더 미리 컴파일된 헤더(PCH)는 헤더 파일 집합의 컴파일러 메모리 스냅샷을 만들어 컴파일 시간을 향상시킵니다. 이는 헤더 파일을 반복적으로 다시 빌드할 때 개선된 기능입니다.

PCH 파일에는 유지 관리가 어려운 제한 사항이 있습니다.

PCH 파일은 .보다 #include import빠르지만 속도가 느립니다.
헤더 단위 이 기능은 '잘 작동하는' 헤더 파일을 모듈로 가져올 수 있는 C++20의 새로운 기능입니다.

헤더 단위는 PCH(미리 컴파일된 헤더 파일)보다 #include더 빠르고, 유지 관리가 쉽고, 훨씬 작고, 더 빠릅니다.

헤더 단위는 명명된 모듈이 매크로를 노출하지 않으므로 헤더 파일에 정의된 매크로를 사용하는 경우 명명된 모듈로 전환하는 데 도움이 되는 '중간' 단계입니다.

헤더 단위는 명명된 모듈을 가져오는 것보다 느립니다.

헤더 단위는 머리글 단위가 빌드될 때 명령줄에 지정되지 않는 한 매크로 정의의 영향을 받지 않으므로 헤더 파일보다 더 강력합니다.

헤더 단위는 헤더 파일처럼 정의된 매크로 및 내부 구현을 노출하며, 명명된 모듈은 그렇지 않습니다.

파일 크기의 대략적인 근사치로 250메가바이트 PCH 파일은 80메가바이트 헤더 단위 파일로 표시될 수 있습니다.
모듈 이 방법은 기능을 가져오는 가장 빠르고 강력한 방법입니다.

모듈 가져오기 지원은 C++20에서 도입되었습니다. C++23 표준 라이브러리는 이 항목에 설명된 두 개의 명명된 모듈을 소개합니다.

가져올 std때 확장명 없음, 내부 도우미(예: std::vectorstd::cout내부 도우미 및 매크로 없음)와 같은 _Sort_unchecked표준 이름을 가져옵니다.

매크로나 다른 부작용이 없으므로 가져오기 순서는 중요하지 않습니다.

파일 크기의 대략적인 근사치로 250메가바이트 PCH 파일은 25메가바이트 모듈로 표현될 수 있는 80메가바이트 헤더 단위 파일로 표현될 수 있습니다.

명명된 모듈이 파일 및 .obj 파일로 .ifc 컴파일될 때 컴파일러는 모듈을 가져올 때 신속하게 로드할 수 있는 소스 코드의 구조화된 표현을 내보내므로 명명된 모듈은 더 빠릅니다. 컴파일러는 명명된 모듈이 순서 독립적이고 매크로 독립적이므로 파일을 내보내 .ifc 기 전에 일부 작업(예: 이름 확인)을 수행할 수 있으므로 모듈을 가져올 때 이 작업을 수행할 필요가 없습니다. 반면 헤더 파일을 사용하는 #include경우 모든 번역 단위에서 해당 내용을 전처리하고 반복해서 컴파일해야 합니다.

컴파일러 메모리 스냅샷인 미리 컴파일된 헤더는 이러한 비용을 완화할 수 있지만 명명된 모듈은 완화할 수 없습니다.

앱에서 C++20 기능 및 C++23 표준 라이브러리를 사용할 수 있는 경우 명명된 모듈을 사용합니다.

C++20 기능을 사용할 수 있지만 시간이 지남에 따라 모듈로 전환하려면 중간에 헤더 단위를 사용합니다.

C++20 기능을 사용할 수 없는 경우 미리 컴파일된 헤더를 사용하고 #include 고려합니다.

참고 항목

미리 컴파일된 헤더 파일
C++에서의 모듈 개요
자습서: 모듈을 사용하여 C++ 표준 라이브러리 가져오기
연습: STL 라이브러리를 헤더 단위로 가져오기
연습: Visual C++ 프로젝트에서 헤더 단위 빌드 및 가져오기