2017-01-11 1 views
6

위키 레퍼런스에는 일부 헤더에 많은 양의 소스 코드가 포함되어있을 수 있으므로 미리 컴파일 된 헤더로 컴파일 시간을 절약 할 수 있다고 언급되어 있습니다. https://en.wikipedia.org/wiki/Precompiled_header미리 컴파일 된 헤더와 미리 컴파일 된 바이너리의 차이점

미리 컴파일 된 헤더에 컴파일 된 소스 코드가 포함될 수있는 경우 사전 컴파일 된 바이너리와 다른 점은 무엇입니까?

+3

사전 컴파일되지 않은 이진 파일 같은 것이 없으므로 '미리 ​​컴파일 된 이진 파일'개념은 처음에 다른 것을 비교하는 것이 아닙니다. – EJP

+0

지적 해 주셔서 고맙습니다 ... 미리 컴파일 된 소스로 호출해야한다고 생각합니다. – bharath

답변

2

C++은 "번역 단위"의 개념을 정의합니다. 번역 단위는 번역이 시작되는 앵커 지점이며 일반적으로 프로그램은 여러 번역 단위로 구성됩니다. "번역 단위"로 컴파일러에 전달되는 단위는 실제로 IDE의 설정, 메이크 파일 및 기타 구성에 따라 다릅니다. 하지만 비공식적으로 대부분의 구성은 .cpp.c - 파일을 번역 단위로 사용합니다.

컴파일러가 바이너리를 만드는 것과 같이 번역 단위를 생각해 볼 수 있습니다. 링커는 여러 바이너리를 결합하여 프로그램에 결합합니다.

그래서 헤더 파일은 일반적으로 번역 단위로 구성되지 않으며 소스 코드가 포함되어 있어도 일반적으로 자체적으로 바이너리를 생성하지 않습니다. 그들은 오히려 번역 단위에서 수입되는 것으로 생각되며 함께 번역 될 것입니다.

이러한 헤더 파일은 여러 번역 단위에 포함될 많은 소스 코드를 포함하는 경우 해당 파일을 한 번 컴파일하고 중간 결과에 최대한 많은 정보를 보관하는 것이 좋습니다 실제 번역 단위를 컴파일하는 것이 더 빠릅니다. 이렇게하면 시간이 절약되지만 "중간 바이너리"는 내부적 인 것이며 노출되지 않습니다.

그러나 내용과 소스 코드 유형에서 헤더 파일은 다른 소스 코드 파일과 구별 할 수 없습니다. "헤더 파일"을 번역 단위로 컴파일러에 전달할 수 있으며 컴파일러는 실제로 "일반"바이너리를 생성합니다. 실제로 컴파일 할 때 일반적으로 루트로 선언되지 않는다는 것입니다.

희망이 있습니다.

1

가장 큰 차이점은 컴파일 된 소스에 비해 미리 컴파일 된 헤더에 저장된 정보가 많다는 것입니다. 원본을 바이너리로 컴파일하면 정의 및 템플릿에 대한 정보가 손실됩니다. 그들의 값으로 사라지는 것을 정의하고 템플릿은 바이너리로 인스턴스화 된 형식으로 만 얻습니다. 미리 컴파일 된 헤더는 사전 컴파일 된 헤더가 어딘가에 포함되어있는 경우 필요한 일반 폼의 템플릿과 이름 및 값에 대한 정보를 유지합니다. 순수 소스 사전 컴파일 된 헤더의 경우 컴파일 된 소스와 동일합니다.

+0

"순수 소스 미리 컴파일 된 헤더가 컴파일 된 소스와 동일합니다." .pch 파일을 만들 때 소스 코드 부분을 직접 이진 형식으로 변환한다고 가정 할 수 있습니까? – bharath

+1

첫 번째 : 인라인 함수 옆에 헤더 파일에 실제 코드가 없어야합니다. 인라인 요소는 실제 바이너리로 변환되어 사용 장소에 복사됩니다. 헤더 파일의 코드 중 가장 눈에 잘 띄는 부분 인 함수와 같은 매크로와 템플릿은 인수에 따라 다르기 때문에 이진 코드로 전송할 수 없습니다. – user6556709

관련 문제