2009-03-27 1 views
37

미리 컴파일 된 헤더 파일의 가장 적합한 후보는 무엇입니까? 템플리트를 가지고 있더라도 STL과 Boost 헤더를 거기에 둘 수 있습니까? 그리고 그것은 컴파일 시간을 단축 할 것인가? 또한 컴파일 시간을 줄이는 가장 좋은 IDE 설정은 무엇입니까?미리 컴파일 된 헤더에 무엇을 넣을까요? (MSVC)

+3

PCH를 사용하지 않는 것이 좋습니다. 그 이유는 (1) 내가 처음으로 cpp 파일에 해당 헤더가 포함되어 있으므로 헤더를 알 수 있습니다. compilation (2) 필자의 경험에 따르면 pch로 인한 치핑이 완전히 신뢰할 수 없기 때문에 증분 빌드가 신뢰할 수 없게됩니다 매우 큰 프로젝트에서. 제 생각에는 밸런스를 사용하지 않고 pch를 사용하지 않고 안정적인 증분 빌드의 이점을 누리는 것이 더 효율적입니다. 이것은 더 이상 최신 Visual Studio 버전의 경우가 아닐 수 있습니다. 저의 경험으로는 여전히 판단하기에 충분하지 않습니다. – Permaquid

답변

47

빠른 응답 : STL 및 부스트 헤더는 실제로 미리 컴파일 된 헤더 파일에 속합니다. 이러한 헤더 파일이 템플릿 클래스를 정의하더라도.

컴파일러는 미리 컴파일 된 헤더 파일을 생성 할 때 헤더 텍스트 (중요한 작업!)를 구문 분석하고이를 컴파일러의 이익을 위해 최적화 된 이진 형식으로 변환합니다.

다른 .cpp 파일을 컴파일 할 때 템플릿 클래스가 인스턴스화되는 경우에도 컴파일러에서 읽을 수있는 훨씬 빠른 프리 컴파일 된 헤더 정보로 인스턴스화됩니다.


(나중에 추가) 당신이 하지 프로젝트의 일부이며 모든 단일 .CPP 파일이 포함 된 경우에도, 자주 변경되는 파일을 미리 컴파일 된 헤더에 포함되어 있어야

한 가지 이 파일들.

이유는 boost, stl 및 windows 라이브러리가 매우 크기 때문에 미리 컴파일 된 헤더가 생성되는 데 오랜 시간이 걸릴 수 있습니다.

모든 것이 사용하는 간단한 파일 (예 : "StringDefs.h")이있을 수 있습니다. StringDefs.h가 stdafx.h에 포함되어 있고 한 개발자가 StringDefs.h를 건 드리면 모든 개발자는 전체가 미리 컴파일 된 헤더 이 다시 컴파일 될 때까지 기다려야합니다. StringDefs.h가 미리 컴파일 된 헤더에서 제외되고 각 .CPP 파일과 함께 구문 분석되는 경우 훨씬 더 빠를 것입니다.

+0

자주 변경되는 파일을 포함하여 전체 빌드 시간이 느려질 것이라는 점은 분명한 사실입니다. – Andy

+4

.cpp 파일 당 하나의 미리 컴파일 된 헤더 파일 만 가질 수 있지만 프로젝트에 미리 컴파일 된 헤더가 여러 개있을 수 있습니다. –

+1

PCH가 다시 컴파일 될 때까지 기다릴 필요가있을뿐만 아니라이를 사용하는 모든 파일에 대해서도 기다려야합니다. –

-1

미리 컴파일 된 헤더에 프로젝트의 .cpp 파일 대부분에 포함될 내용을 넣으십시오. 이것은 어떤 헤더 파일에도 적용됩니다. 이를 통해 컴파일러는 이러한 파일을 한 번 구문 분석 한 다음 동일한 프로젝트의 모든 .cpp 파일에서 해당 정보를 다시 사용할 수 있습니다.

+2

나는 동의하지 않으며 이유를 설명하기 위해 회신에 추가 섹션을 작성했습니다. –

+0

미리 컴파일 된 헤더는 프로젝트 로컬 헤더를 포함해서는 안됩니다. – Tom

+0

나는이 잘못된 조언을 따르고 매우 비효율적 인 프로젝트에서 광범위하게 작업했습니다. 컴파일 할 때마다 모든 것이 변경되기 때문에 컴파일됩니다. – Permaquid

6

Andrew Shepherd의 답변에 하나가 추가되었습니다. 자주 변경되지 않는 파일의 경우 프로젝트 외부에있는 헤더 파일에 미리 컴파일 된 헤더를 사용하십시오. 현재 프로젝트의 헤더 파일을 항상 변경하는 중이면 미리 컴파일 할 가치가 없을 것입니다.

3

나는 컴파일 시간을 줄이는 기술에 관한 기사를 작성했다. 이러한 기술 중 미리 컴파일 된 헤더 및 해당 응용 프로그램에 대한 게시물은 here입니다. 흥미있는 모범 사례에 관한 섹션도 있습니다. 투명하게 처리하는 CMake 스크립트가 포함되어 있습니다.