문제

C ++에서는 방법이 명시 적으로 선언 된 경우에만 메소드를 감소시킵니다. inline (또는 헤더 파일에 정의 됨), 또는 컴파일러가 적합하다고 생각되는 방법을 인라인으로 허용됩니까?

도움이 되었습니까?

해결책

예, 컴파일러는 명시 적으로 선언되지 않더라도 코드를 인라인 할 수 있습니다. inline.

기본적으로 의미론이 변경되지 않는 한 컴파일러는 생성 된 코드에 대해 원하는 것을 사실상 수행 할 수 있습니다. 표준은 생성 된 코드에서 특별한 것을 강요하지 않습니다.

다른 팁

그만큼 인라인 키워드는 실제로 링커를 알려줍니다 (또는 동일한 함수의 여러 동일한 정의가 오류가 아니라고 링커에 (또는 컴파일러에게 링커를 알려 주라고 지시). 헤더에서 함수를 정의하려면 헤더가 둘 이상의 컴파일 장치에 포함 된 경우 링커에서 "다중 정의"오류가 발생하면 필요합니다.

선택에 대한 이론적 근거 인라인 키워드가 헤더에서 (비 테일 플레이트) 함수를 정의하려는 유일한 이유는 컴파일러에 의해 인쇄 될 수 있기 때문입니다. 컴파일러는 전체 정의가 없으면 함수 호출을 인라인으로 인라인 할 수 없습니다. 함수가 헤더에 정의되지 않은 경우 컴파일러는 선언 만 있고 원하는 경우에도 기능을 인화 할 수 없습니다.

요즘에는 코드를 최적화하는 컴파일러뿐만 아니라 링커도 그렇게 할 수 있습니다. 링커는 함수가 동일한 컴파일 장치에 정의되지 않은 경우에도 인라인 함수 호출을 할 수 있습니다.

그리고 아마도 헤더의 한 줄보다 큰 함수를 정의하는 것은 좋은 생각이 아닐 것입니다 (컴파일 시간에 좋지 않으면 큰 함수가 팽팽 해지면 부풀어 오르고 성능이 악화 될 수 있습니다).

컴파일러는 기능을 인화하거나 인라인을 인화하지 못할 수 있습니다. 그들은 사용할 수 있습니다 inline 이 결정에 대한 힌트로 장식이지만, 그것들을 무시할 수 있습니다.

또한 클래스 멤버 기능은 암시 적입니다 inline 클래스 정의에서 바로 정의 된 경우 장식.

컴파일러는 인라인 선언을 무시할 수 있습니다. 기본적으로 컴파일러는 그렇게할지 여부를 결정하기 위해 힌트로 사용됩니다. 컴파일러는 인라인으로 표시된 것을 인라인으로 표시하거나 그렇지 않은 것을 인화하지 않아야합니다. 기본적으로 당신은 컴파일러의 자비와 선택한 최적화 수준에 있습니다.

내가 착각하지 않으면 최적화가 켜져 있으면 컴파일러가 적절한 루틴이나 방법을 인화합니다.

텍스트 IBM 정보 센터,

인라인 지정자를 사용하는 것은 컴파일러에 인라인 확장을 수행 할 수 있다는 제안 일뿐입니다. 컴파일러는 제안을 무시할 수 있습니다.

C 언어 메인을 제외한 모든 함수는 인라인 함수 지정자와 인라인으로 선언하거나 정의 할 수 있습니다. 정적 로컬 변수는 인라인 함수의 본문 내에서 정의 할 수 없습니다.

C ++ 클래스 선언 내부에서 구현 된 기능은 자동으로 인라인으로 정의됩니다. 메인을 제외하고 클래스 선언 외부에서 선언 된 일반 C ++ 기능 및 멤버 기능은 인라인 함수 지정자와의 인라인으로 선언되거나 정의 될 수 있습니다. 인라인 함수의 본문 내에 정의 된 정적 로컬 및 끈 리터럴은 번역 단위에 걸쳐 동일한 물체로 취급됩니다.

컴파일러 문서는 구현 종속이기 때문에 알려야합니다. 예를 들어, 매뉴얼에 따른 GCC는 최적화가 적용되지 않는 한 코드를 상감하지 않습니다.

컴파일러가 코드를 인화하지 않으면 인라인 키워드는 동일한 효과를 갖습니다 공전, 및 코드를 호출하는 각 편집 장치에는 자체 사본이 있습니다. 스마트 링커는 이것을 단일 사본으로 줄일 수 있습니다.

컴파일러는 Inlining이 코드 시맨틱을 위반하지 않고 함수 코드에 도달 할 수있는 경우에 원하는 모든 것을 활용할 수 있습니다. 또한 선택적으로 인라인 할 수 있습니다. 좋은 아이디어라고 느끼고 좋은 생각이 아니라고 느끼지 않거나 코드 의미론을 위반할 때 인라인이 아닙니다.

일부 컴파일러는 함수가 다른 번역 장치에 있더라도 링크 - 시간 코드 생성이라고도 할 수 있습니다.

인라인이 코드 시맨틱을 위반하는 경우의 일반적인 경우는 가상 호출이며 기능 주소를 다른 함수로 전달하거나 저장합니다.

컴파일러는 반대를 지정하지 않는 한 원하는대로 최적화합니다.

인라인 키워드는 컴파일러에 대한 요청 일뿐입니다. 컴파일러는 기능을 인라인으로 만들거나 만들지 않을 권리를 보유합니다. 컴파일러의 결정을 주도하는 주요 요인 중 하나는 코드의 단순성입니다 (많은 루프가 아님)

회원 기능은 기본적으로 인라인으로 선언됩니다. (컴파일러도 여기에서도 결정합니다)

이것들은 어렵고 빠른 규칙이 아닙니다. 컴파일러 구현에 따라 다릅니다.

관련된 다른 요인을 알고 있다면 게시하십시오.

인라인 확장이 작동하지 않는 상황 중 일부는 다음과 같습니다.

  1. 값을 반환하는 함수, 루프, 스위치 또는 goto가 존재하는 경우
  2. 리턴 명령문이 종료되는 경우 값을 반환하지 않는 함수의 경우;
  3. 함수에 정적 변수가 포함 된 경우
  4. 인라인 함수가 재귀 인 경우.

인라인 확장은 함수 호출 및 반환 문의 오버 헤드가 제거되므로 프로그램을 더 빨리 실행합니다. 그러나 인라인 함수를 정의하는 진술이 함수가 호출되는 각 지점에서 재현되기 때문에 프로그램이 더 많은 메모리를 취할 수 있습니다. 따라서 트레이드 오프가 필요합니다.

(내 OOP 책 중 하나에 주어진대로)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top