2012-08-27 3 views
4

의 차이점이 질문은 "이 문제가 발생했습니다"라는 질문과 "언어가 더 잘 작동하는 방법을 정말 알고 싶습니다."라는 질문에 더 많이 포함됩니다.C++ - CPP에 정의 된 인라인과 H

최근에 주어진 클래스의 .cpp 파일에서 인라인 기능에 대한 정의가 발생하기 시작했습니다. 인라인 기능에 대한 정의 점의 차이가 실제로 무엇인지 이해하고 싶습니다. CPP에 정의 된 인라인에 대한 객체 수준의 분석을 수행 할 때 C++ (.h에 정의 된 것과 반대되는)에서 선언 된 인라인의 훨씬 높은 비율이 합법적으로 인라인되지 않고 매핑 된 함수에 최적화 된 것처럼 보입니다. 이것이 가장 큰 차이점이거나, 내가보기에는 완전히 보이지 않는 다른 목적이 있습니다.

+1

몇 가지 코드 예제를 제공해 주시겠습니까? 네가하는 말은 정말로 분명하지 않다. –

+0

특히, 주어진 클래스에 대해 .cpp에 배치되는 대 주어진 클래스에 대해 .h에 배치되는 인라인 클래스 :: foo (void) {stuff}와 사이의 차이점을 찾고있었습니다. – Kat

답변

2

inline번역 단위 당 단 하나의 단일 정의이 없으면 함수가 이해가되지 않으므로 정의를 다시 사용할 수있는 헤더 파일에 배치하는 것이 좋습니다. inline 함수가 하나의 소스 파일에서만 사용되는 경우에는 로컬로 정의하는 것이 좋습니다. 모두 문맥의 문제입니다.

+1

그건 사실이 아닙니다. 그것은 당신의 컴파일러에 달려 있습니다. 예를 들어 Visual C++를 사용하는 경우 "전체 프로그램 최적화"를 사용할 수 있습니다. 이 경우 링커는 동일한 번역 단위에 정의되어 있는지 여부에 관계없이 함수를 인라인 할 수 있습니다. –

+1

C++ 03 표준에 따라 §7.1.2.4 "** 인라인 함수는 사용되는 모든 변환 단위에서 정의되어야하며 모든 경우에 동일한 정의 (§3.2)가 정확히 이어야합니다. * * "특정 컴파일러의 확장과 관련이 없습니다 :-p – slavemaster

+0

겸허하게 당신이해야한다고 제안합니까? 전체 프로그램 최적화가 _ 특징입니다. –

3

차이는 없습니다. inline은 컴파일러에 대한 힌트이지만 요즘은 특히 중요하지 않습니다. 컴파일러가 도움없이 함수를 인라인으로 확장할지 여부를 알아 내는데 꽤 능숙하기 때문입니다 (register 키워드 참조).

inline도 헤더 파일에 인라인 함수를 넣을 때 필요한 다른 번역 단위의 여러 정의가 모두 동일하다는 가정하에 컴파일러에 알립니다.

인라인 함수가 .cpp 파일에 정의되어있는 경우 해당 파일에만 해당 정의가 표시되므로 다른 소스 파일에서이 함수를 호출해도 작동하지 않습니다.

+0

우수, 정말 고마워요! – Kat

1

컴파일러가 "링크 타임"/ "전체 프로그램"최적화를 수행하지 않았기 때문에 결과가 달라질 수 있습니다. 이것은 컴파일러가 단 하나의 번역 단위 대신 전체 프로그램을 보면서 최적화를 수행하는 경우입니다. 일반적으로 매우 높은 메모리 사용량을 포함하기 때문에 컴파일러를 지원하는 컴파일러에서도 기본적으로 설정되지 않습니다.

번역 단위 수준에서만 최적화 할 때 정의를 사용할 수 없기 때문에 다른 소스 파일에 정의 된 함수를 인라인 할 수 없습니다.

1

컴파일러가 인라인하지 않고 호출하기 전에 인라인 함수를 정의하면 인라인 함수가 인라인 함수에 더 쉽게 적용됩니다. 헤더 파일은 일반적으로 소스 맨 위에 포함되므로이 조건을보다 쉽게 ​​충족 할 수 있습니다.

0

기술적으로는 입니다. 이 .cpp 파일에 #include을 발견 한 곳

내가 생각, 그들과 최적화에 대해 많이 알고하지 않지만

...

처리기 먼저 .H 파일을 확장합니다. 그리고 다음 그것은 컴파일러에 제공됩니다. 기술적으로 전혀 차이가 없습니다.

inline 함수가 호출되는 모든 컴파일 단위에 정의되어야합니다

는하지만, 규칙이있다. 물론 ODR을 따라야합니다.

이것은 모든 컴파일 단위가 별도의 컴파일러 프로그램 인스턴스로 처리되기 때문입니다.

따라서 일반적으로 인라인 함수는 해당 함수를 호출하는 모든 .cpp 파일에 포함 된 헤더 파일에 정의됩니다.

관련 문제