2011-07-05 2 views
6

C++의 인라인 함수를 연구하고 사용 제한에 관한 절을 읽었습니다. 그것은 말한다 다음 함수의 주소가 암시 적으로 또는 명시 적으로 가지고가는 경우에인라인 기능을 사용할 수없는 시간

컴파일러는 인라인을 수행 할 수 없습니다.

어떤 사람이 내게 설명 할 수 있습니까?

+3

오우 나는이 새로운 무료 질문 downvotes 시스템이 싫다. 이 질문에 뭐가 잘못 됐지, 사람들? –

+0

호기심에서, 그 책은 무슨 책을 만들고 있나? –

+1

익명의 운전자 답장 카운터 +1 –

답변

5

컴파일러는 함수 인라인에 관한합니다 : 특정 함수 호출은 인라인 여부를

  • ;
  • 함수의 인라인 버전이 아닌지 여부.

첫 번째는 해당 지점에서 인라이닝이 가능할 경우 사례별로 컴파일러가 결정합니다. 함수가 가상이거나 함수 포인터를 통해 호출되는 경우에는 불가능하며 호출 할 함수를 컴파일 타임에 결정할 수 없습니다. 컴파일러가 다른 번역 단위로 정의되고 컴파일러가 "전체 프로그램 최적화"를 수행하지 않기 때문에 컴파일러에서 정의를 사용할 수없는 경우에는 가능하지 않습니다. 결정은 함수가 선언되었는지 여부에 따라 영향을받을 수도 있고 그렇지 않을 수도 있습니다. 크기 및 빈도와 같은 다른 요소가 결정됩니다.

두 번째 단계는 인라인 버전이 아닌지 여부에 따라 달라집니다. 모든 호출이 인라인되지 않으면 필수입니다. 함수의 주소가 필요한 경우 (인용문에 따라) 함수 주소가 필요하므로 함수의 주소가 필요한 경우 필요합니다. 이것은 직접 (예를 들어, 주소를 함수 포인터에 할당하는 것과 같이) 직접적으로 또는 간접적으로 발생할 수 있습니다 (예 : 가상 함수는 객체의 동적 유형에 따라 런타임을 찾기 위해 어딘가에 저장된 주소가 필요합니다).

비 인라인 버전의 존재는 컴파일러의 결정에 영향을 미칠 수 있지만 특히 코드 크기를 최적화하도록 구성된 경우 함수의 특정 호출이 인라인되지 못하도록하지 않습니다.

요약하면 인용문은 단순하고 정확하지는 않습니다. 컴파일러는 주소를 가져 가면 여전히 "인라이닝 수행"할 수 있으며 비 인라인 버전은 생략 할 수 없습니다.

+0

감사합니다. 주소를 할당 한 사례 함수 포인터를 사용하면이 문장의 의미를 이해하는 데 도움이됩니다. –

4

함수 호출을 인라인하는 기능은 2 + 2를 계산하거나 어딘가에 함수의 주소를 가져 오는 것으로 영향을받지 않습니다.

어떤 책이나 기사를 읽으십니까?

주소가 찍히는 경우에, 분리되는 기계 부호 기능을 제거하는 것이 실제로 불가능할 수도 있습니다.

건배 & HTH.,

+0

http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter09_009.html –

+0

아, "Thinking in C++"by Bruce Eckel. 글쎄, 그 책에서 상당수의 오류가 수년 동안 떠올랐다. 그러나 내가 아는 한, 브루스는 결코 어떤 것도 고쳐 내지 못했다. 그러니주의하십시오. 그는 초보자에게 좋은 물건을 씁니다. 그러나 그는 무의미하고 잘못된 것을 씁니다. 그가 여기에서했던 것처럼. –

+0

실수로 언급 할 때 책의 한 질문에서 print라는 인라인 함수가 들어있는 클래스를 헤더 파일에 만들 것을 요청합니다. 그러나 책 솔루션에서는 헤더에 print() 선언 만 있고 sepearate 파일에 정의되어 있습니다. 나는 이것이 실수라고 말하고 있는데, 헤더 파일에 인라인 함수를 넣으려면 인라인 함수가 될 정의와 선언을 모두 포함해야합니다. –

6

당신은 인라인으로 어떤 기능을 표시 할 수 있습니다. 심지어 가상 함수, 심지어 재귀 함수, 심지어 veeery veery 긴 함수, 주소가 찍은 경우에도. 인라인 함수와 비 인라인 함수의 주된 차이점은 함수의 정의가 모든 변환 단위 (일명 소스 파일)에 사용되어야한다는 것입니다 (인라인 함수는 일반적으로 .h 파일에서 정의됩니다). 반면에 후자는 한 번만 정의되어야합니다. 인라인 함수는 인라인 이외의 함수를 사용할 수있는 모든 방법으로 사용할 수 있습니다.

실제 인라이닝 부분은 컴파일러의 책임입니다. 예를 들어 함수가 반복적이거나 너무 길면 요청을 무시할 수 있습니다. 반면 컴파일러는 실제로 인라인으로 표시하지 않은 함수를 인라인 할 수 있습니다. 이 다소 별도의 결정이 있습니다

+1

최신 버전의 GCC에는 전체 프로그램 최적화를위한 옵션이 있습니다. AFAIK는 헤더에 인라인 될 희망 코드를 배치 할 필요가 있습니다. – Nim

관련 문제