먼저 몇 가지 가정을 철거합시다.
- C ++ 용 헤더 전용 라이브러리의 장점 중 하나는 별도로 컴파일 할 필요가 없다는 것입니다.
사물을 개별적으로 컴파일한다는 것은 부분 만 바뀌더라도 모든 것을 다시 컴파일 할 필요가 없다는 것을 의미합니다.
따라서 장점 대신 단점이 있습니다.
- C 및 C ++에서 인라인은 함수가 헤더 파일 *에 정의 된 경우에만 의미가 있습니다.
예, inline
남은 유일한 효과 는 one-definition-rule 의 예외 입니다.
그래도 그 정의가 다르면 당신에게 화가납니다.
따라서 함수가 컴파일 단위 내부에 있으면 표시하십시오 static
. 또한 인라인 기능을 사용할 수 있어야하므로 인라인 가능성이 높아집니다.
여전히 MSVC ++, gcc 및 clang에서 지원하는 링크 타임 최적화를 살펴보십시오.
- 전통적으로 C에서는 .c / .h 레이아웃이 사용되었으며, 여기서 헤더는 번역 단위의 최소 공용 인터페이스를 나타냅니다. 마찬가지로 .cpp / hpp.
글쎄, 최소한의 인터페이스 만 제시하는 것은 확실히 API 및 ABI 안정성을 높이고 컴파일 시간을 최소화하는 목표 중 하나입니다.
특히 C ++ 클래스는 모든 개인 비트가 헤더로 누출되므로 보호 된 클래스와 마찬가지로 헤더에서 누출되기 때문에 실제로 그에 맞게 조정되지 않았습니다.
디자인 패턴 PIMPL 은 이러한 세부 사항을 줄이기위한 것입니다.
C ++에서 인터페이스와 구현을 완전히 분리하지 못하는 부분은 템플릿입니다.
위원회는 내 보낸 템플릿으로 무언가를 시도했지만 너무 복잡하고 실제로 작동하지 않았습니다.
이제는 느리지 만 적절한 모듈 시스템 에서 작업하고 있습니다. 이는 컴파일 시간을 크게 줄이고, 표면을 줄여 API 및 ABI 안정성을 높여야합니다.
헤더 전용 라이브러리는 일반적으로 기존 레이아웃보다 코드 및 실행 시간이 더 효율적입니까? 그렇다면 광범위한 인라인 또는 기타 최적화로 인한 것입니까?
헤더 전용 라이브러리는 코드 크기 및 실행 시간이 더 효율적일 수 있지만 라이브러리 공유 여부, 사용 횟수, 방법 및 인라이닝이 특정 경우에 결정적인 승리를 나타내는 지 여부에 따라 다릅니다.
인라인 자체가 최적화에 중요한 이유는 인라인 자체가 크게 향상되지 않았기 때문에 지속적인 전파 및 추가 최적화 기회가 있기 때문입니다.