C ++의 헤더 파일에 함수 정의 작성
작은 기능이 많은 수업이 있습니다. 작은 함수 란 처리를하지 않고 리터럴 값만 반환하는 함수를 의미합니다. 다음과 같은 것 :
string Foo::method() const{
return "A";
}
헤더 파일 "Foo.h"와 소스 파일 "Foo.cpp"를 만들었습니다. 하지만 함수가 매우 작기 때문에 헤더 파일 자체에 넣을 생각입니다. 다음과 같은 질문이 있습니다.
- 이 함수 정의를 헤더 파일에 넣으면 성능이나 다른 문제가 있습니까? 이와 같은 많은 기능을 갖게 될 것입니다.
- 내 이해는 컴파일이 완료되면 컴파일러가 헤더 파일을 확장하여 포함 된 위치에 배치합니다. 그 맞습니까?
함수가 작고 (자주 변경할 가능성이 낮고) 함수가 무수히 많은 다른 헤더를 포함하지 않고 헤더에 넣을 수 있다면 (함수가 의존하기 때문에) 그렇게하는 것이 완벽하게 타당합니다. extern 인라인으로 선언하면 컴파일러는 모든 컴파일 단위에 대해 동일한 주소를 제공해야합니다.
headera.h :
inline string method() {
return something;
}
멤버 함수는 클래스 내부에 정의 된 경우 암시 적 인라인입니다. 그들에게도 똑같은 사실이 사실입니다. 번거 로움없이 헤더에 넣을 수 있다면 실제로 그렇게 할 수 있습니다.
함수의 코드가 헤더에 삽입되고 표시되기 때문에 컴파일러는 함수에 대한 호출을 인라인 할 수 있습니다. 즉, 함수 코드를 호출 사이트에 직접 넣을 수 있습니다. 하지만 컴파일러가 그 방식을 결정하기 때문입니다. 인라인 만 넣는 것은 컴파일러에 대한 힌트입니다). 컴파일러는 이제 인수가 함수의 로컬 변수와 일치하는 위치와 인수가 서로 별칭을 지정하지 않는 위치를 확인하고 마지막으로 함수 프레임 할당이 더 이상 필요하지 않기 때문에 성능이 향상 될 수 있습니다.
내 이해는 컴파일이 완료되면 컴파일러가 헤더 파일을 확장하여 포함 된 위치에 배치합니다. 그 맞습니까?
네, 맞습니다. 함수는 헤더를 포함하는 모든 위치에서 정의됩니다. 컴파일러는 다른 인스턴스를 제거하여 결과 프로그램에 하나의 인스턴스 만 넣는 데 관심을 갖습니다.
컴파일러와 설정에 따라 다음 중 하나를 수행 할 수 있습니다.
- 인라인 키워드 (명령이 아니라 컴파일러에 대한 힌트 일뿐)를 무시하고 독립형 함수를 생성 할 수 있습니다. 함수가 컴파일러 종속 복잡도 임계 값을 초과하면 이렇게 할 수 있습니다. 예 : 너무 많은 중첩 루프.
- 독립형 함수가 인라인 확장에 적합한 후보인지 결정할 수 있습니다.
대부분의 경우 컴파일러는 함수가 사용자보다 인라인되어야하는지 여부를 결정하는 데 훨씬 더 나은 위치에 있으므로 두 번째로 추측 할 필요가 없습니다. 클래스에서 바로 구현하는 것이 편리하기 때문에 클래스에 작은 함수가 많을 때 암시 적 인라인을 사용하는 것을 좋아합니다. 더 큰 기능에는 잘 작동하지 않습니다.
명심해야 할 또 다른 점은 DLL / 공유 라이브러리에서 클래스를 내보내는 경우 (IMHO는 좋지 않지만 사람들은 어쨌든 그렇게합니다) 인라인 함수에 대해 정말주의해야한다는 것입니다. DLL을 빌드 한 컴파일러가 함수를 인라인해야한다고 결정하면 몇 가지 잠재적 인 문제가 있습니다.
- DLL을 사용하여 프로그램을 빌드하는 컴파일러는 함수를 인라인하지 않기로 결정할 수 있으므로 존재하지 않는 함수에 대한 기호 참조를 생성하고 DLL이로드되지 않습니다.
- DLL을 업데이트하고 인라인 함수를 변경하면 함수가 클라이언트 코드에 인라인되었으므로 클라이언트 프로그램은 해당 함수의 이전 버전을 계속 사용합니다.
헤더 파일의 구현이 암시 적으로 인라인되기 때문에 성능이 향상됩니다. 귀하의 기능이 작다고 언급했듯이 인라인 작업은 IMHO에 매우 유용합니다.
컴파일러에 대한 당신의 말도 사실입니다. 컴파일러는 헤더 파일이나 .cpp
파일의 코드간에 인라인을 제외하고는 차이가 없습니다 .
함수가 그렇게 간단하다면 인라인으로 만들고 어쨌든 헤더 파일에 붙여야합니다. 그 외에는 모든 규칙은 바로 그 규칙입니다.
예, 컴파일러는 #include 문이있는 곳에서 헤더 파일을 확장합니다.
귀하의 경우에 적용되는 코딩 표준에 따라 다르지만 :
루프 나 다른 것이없는 작은 함수는 더 나은 성능을 위해 인라인되어야합니다 (그러나 약간 더 큰 코드-일부 제약 또는 임베디드 애플리케이션에 중요).
헤더에 함수의 본문이 있으면 기본적으로 inline (d)가 있습니다 (속도면에서 좋은 점입니다).
객체 파일이 컴파일러에 의해 생성되기 전에 전처리 기가 호출되고 (gcc의 경우 -E 옵션) 결과는 코드에서 객체를 생성하는 컴파일러로 전송됩니다.
따라서 더 짧은 대답은 다음과 같습니다.
-헤더에서 함수를 선언하는 것은 속도에 좋습니다 (하지만 공간에는 적합하지 않습니다)-
C ++는 불평하지 않지만 일반적으로 말하면 안됩니다.
파일을 #include하면 포함 된 파일의 전체 내용이 포함 지점에 삽입됩니다. 이는 헤더에 입력 한 모든 정의가 해당 헤더를 포함하는 모든 파일에 복사됨을 의미합니다.
소규모 프로젝트의 경우 이것은 큰 문제가되지 않을 것입니다. 그러나 더 큰 프로젝트의 경우 컴파일하는 데 훨씬 더 많은 시간이 소요될 수 있으며 (동일한 코드가 발생할 때마다 다시 컴파일되므로) 실행 파일의 크기가 크게 늘어날 수 있습니다. 코드 파일의 정의를 변경하는 경우 해당 .cpp 파일 만 다시 컴파일하면됩니다. 헤더 파일의 정의를 변경하는 경우 헤더를 포함하는 모든 코드 파일을 다시 컴파일해야합니다. 약간의 변경으로 전체 프로젝트를 다시 컴파일해야 할 수 있습니다!
때때로 변경 될 것 같지 않은 사소한 함수에 대해 예외가 만들어집니다 (예 : 함수 정의가 한 줄인 경우).
출처 : http://archive.li/ACYlo(learncpp.com 의 1.9 장 이전 버전)
인라인 함수를 사용해야합니다. 더 나은 이해와 관련된 장단점을 보려면이 인라인 함수 를 읽으십시오 .
참고 URL : https://stackoverflow.com/questions/453372/writing-function-definition-in-header-files-in-c
'Development Tip' 카테고리의 다른 글
Angular-POST 업로드 파일 (0) | 2020.12.01 |
---|---|
redux 연결 구성 요소는 언제 다시 렌더링할지 어떻게 알 수 있습니까? (0) | 2020.12.01 |
document.cookie에 사이트의 모든 쿠키가 표시되지 않는 이유는 무엇입니까? (0) | 2020.12.01 |
__setstate__ 및 __getstate__ 사용의 간단한 예 (0) | 2020.12.01 |
Android의 Parcelable 및 상속 (0) | 2020.12.01 |