2009-10-21 5 views
3

컴파일 중 성능과 관련하여 C++에서 헤더 파일 또는 소스 파일의 파일을 포함하는 것과 다른 점은 무엇입니까?헤더/소스 파일의 포함 된 파일

파일을 원본 파일에 포함하고 헤더 파일에 포함하지 않는 이유는 무엇입니까 (절대적으로 필요한 경우 제외)?

하나 (헤더)가 컴파일 시간에 영향을 미치고 다른 하나 (소스 파일)가 링크 시간에 영향을 줍니까?

답변

1

성능 질문의 경우 실제 답변은 직접 측정하는 것입니다. 환경은 다른 사람과 다를 수 있습니다.

이 경우 프리 컴파일 된 헤더가 포함되어 있지 않으면 같아야합니다. 포함되어있는 프리 컴파일에 포함 된 경우에는 한 번만 컴파일되므로 더 빠릅니다.

1

마크는 귀하의 환경에서 그것을 측정합니다. 일반적으로 말하자면 소스 파일에 포함 시키면 포함되어 있고 필요한 부분 만 읽습니다. 헤더 파일에 포함 시키면이 헤더 파일이 다른 많은 소스 파일에 포함되므로 컴파일 시간이 늘어납니다. 또한 클래스 헤더 파일을 포함하는 대신 가능하면 헤더 파일에 전달 선언을 사용해야하는 이유이기도합니다.

12

파일을 어느 위치 에든 포함 시키면 파일에서 확장 된 것으로 간주 할 수 있습니다. 그러면 파일은 전 처리기 및 컴파일러에서 처리되어야합니다.

헤더에 무언가를 포함하면 헤더가 포함 된 모든 클라이언트가 해당 헤더를 상속합니다. 따라서 헤더에 파일을 불필요하게 포함 시키면 여러 번역 단위가 확장 될 수 있으므로 성능에 좋지 않은 영향을 미칩니다.

헤더 포함을 클래스 선언에 필요한 것으로 제한하는 것이 좋습니다. 제한을 넘어 클래스에 사용되는 유형을 포함하는 경우 포인터 인터페이스 또는 참조로 클래스 인터페이스에서만 사용되는 유형의 include 대신 forward 선언을 사용할 수도 있습니다.

내 경험상이 성능상의 영향은 대개 눈에 띄지 않습니다. 매우 큰 프로젝트 나 널리 사용되는 헤더에서 작동 할 가능성이 큽니다.

1

사람들은 컴파일 시간을 줄이기 위해 소스 파일 (.cpp/기타 확장자)의 헤더를 포함해야만했습니다. 그렇지 않으면 헤더의 연속이 생성 되었기 때문입니다. 요즘은하지 우려는 더 이상, 그리고 그들이 실제로 필요한 헤더 (심지어는 다른 헤더)를 포함하는 것은 ... 당신이 당신의 소스에 매번 많은 헤더를 포함해야 할 피할 수 있습니다 (더 정교한 답변)

http://www.icce.rug.nl/documents/cplusplus/cplusplus07.html#an973

2

헤더에 헤더를 포함하면 컴파일 단위가 커지고 성능이 떨어집니다. 그러나 이것은 대규모 프로젝트에서만 눈에.니다. 이는 <windows.h>과 같은 OS 헤더의 경우 매우 중요합니다. 이것이 미리 컴파일 된 헤더와 WIN32_LEAN_AND_MEAN이 발명 된 이유입니다.

그러나 다른 헤더에 헤더를 불필요하게 포함 시키면 다른 빌드 성능 문제가 있습니다. 헤더가 변경되면 더 이상 다시 빌드해야 할 수도 있습니다.

고려 : 당신이 A.h을 변경하면 IDE 그들이 클래스 A를 사용하지 않는 경우에도 B.h을 포함 소스를 컴파일합니다

// A.h 
class A 
{ 
    ... 
} 

// B.h 
#include "A.h" 
class B 
{ 
    A *_a; 
    ... 
} 

. 당신이 B.h을 변경한다면 :

// B.h 
class A; // forward declaration, declared in "A.h" 
class B 
{ 
    A *_a; 
    ... 
} 

이 더 이상 필요하지 않을 것입니다. 이것은 소규모 프로젝트에서도 눈에 띄는 차이를 만들 수 있습니다.

관련 문제