2012-03-30 3 views
2

리눅스에서 gcc를 사용하여 C로 개발 중입니다.함수 인라이닝

나는 그들이 인라인 될 수있는 아주 좋은 후보 그래서

 // .H file 
     extern int my_function(int val); 

     // .C file 
     inline int my_function(int val){ 
      // my job..very short! 
     } 

이 기능은 작은 다음과 같은 방법으로 .H과 .C 파일 내 작은 기능을 구성하고 있지만, 그들이 가만히 있으면 나도 몰라 확실히.

필자가 파일을 구성하는 방법에 대해 의구심이 있습니다. 아마도 모든 .c 파일없이 .h 파일에 직접 모든 기능을 인라인하는 것이 더 좋을 것이라고 생각했습니다. 제 의심을 분명히하는 데 조금 도와 드릴까요?

답변

3

우선 -finline-functions 옵션을 추가하여 gcc에 발신자에게 작은 기능을 인라인으로 표시하도록 요청할 수 있습니다. 당신이 당신의 함수가 실제로 인라인 될 것입니다 의심의 여지가있는 경우

, 당신은, 당신의 기능을 모두 externinline을 선언 한, 여기에 -Winline

를 사용하여, uninlinable 기능에 대해 경고하는 GCC을 요청할 수 있습니다 은 인라인됩니다. inline 정의는 인라이닝에만 사용됩니다. 이 특정 상황에서 함수는 자체적으로 컴파일되지 않습니다.

자세한 내용은 http://gcc.gnu.org/onlinedocs/gcc/Inline.html을 참조하십시오.

2

함수가 아무리 작은 경우에도 컴파일러는 선택 여부에 관계없이 인라인을 적용할지 여부를 결정합니다.

함수의 수가 매우 적고 코드에서 모두 인라인한다고해도 컴파일러가 모든 것을 인라인 할 것이라는 보장은 없습니다.

here 인라인에 대한 유용한 inshgts를 찾을 수 있습니다.

0

먼저 컴파일러는 함수를 정의하기 위해 함수 정의를 볼 수 있어야합니다. 따라서 헤더 파일에 정의를 배치해야합니다. (여기서는 응용 프로그램이 둘 이상의 소스 파일로 구성되어 있다고 가정합니다.) 참고 : 일부 개발 환경에서는 다중 파일 컴파일을 지원합니다.이 경우이 설명이 적용되지 않습니다.

두 번째로, 인라인 C99의 의미는 C++에 익숙하다면 약간 혼란 스럽습니다 (일이 "잘 작동하는"경우). C99에서 함수를 소유 한 단일 소스 파일 (헤더 파일 아님)을 하나씩 추출해야합니다. 함수가 일부 소스 파일에 인라인되지 않은 경우에는 함수에 대한 하나의 명시 적 정의가 있어야합니다. 이것은 extern 키워드를 사용하여 함수를 지정하여 수행됩니다. (이는 기존의 해석 인 extern에서 벗어나며 선언문으로 만 사용되었습니다). 예를 들어

:

// .h file 
    inline int my_function(int val) 
    { 
     // my job..very short! 
    } 

    // In ONE .c file 
    extern int my_function(int val);