none
inline 키워드?? RRS feed

  • 질문

  • .cpp 파일

    inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};

    .h 파일

    void TESTHR(HRESULT x); 이런식으로 헤더 파일에 함수에 대한 선언문이 있어야 하는거 아닌가요?
    "inline"은 C++의 키워드 인가요?? 어떤 역활을 하는것인가요? 


    2012년 5월 10일 목요일 오전 2:07

답변

  • inline 은 키워드가 맞습니다. 역할은, 해당 함수에 정의된 코드를 함수를 호출하는 측에 그대로 복사해서 컴파일 해줍니다.

    예를 들어, 제시한 예제에서 다음과 같이 TESTHR 을 호출한다면,

    void MyFunc()
    {
       HRESULT hr = 0;
      TESTHR(hr);
      TESTHR(hr);
    }

    inline 함수의 경우에는 다음과 같이 펼쳐져서 컴파일이 됩니다.

    void MyFunc()
    {
      HRESULT hr = 0;
      if FAILED(hr) _com_issue_error(hr);
      if FAILED(hr) _com_issue_error(hr);
    }

    이렇게 해주는 이유는, 함수 호출에 따른 오버헤드를 없애기 위해서입니다.


    2012년 5월 10일 목요일 오전 4:30
  • 우리가 연산을 위해서 사용하는 CPU 의 경우에는

    함수를 호출할 때, CPU의 상태 정보를 저장하고 복구하는 작업을 내부적으로 수행합니다.

    이렇게 개발자가 의도하지 않았지만, 자동적으로 코드가 생성되어서 실행되는 루틴을 오버헤드라고 부릅니다.

    당연히 CPU 관련 명령어가 추가되었기 때문에 이론적으로는 느려질 수 있습니다.

    ( CPU가 굉장히 빠르기 때문에, 이런 것 때문에 '느리다' 라고 체감하기는 어렵습니다.^^ )

    inline 을 사용하게 되면 이러한 별도의 저장하고 복구하는 코드를 생성하지 않고,

    해당 함수들의 코드를 바로 명령어화 해버리기 때문에 성능에 이점이 생깁니다.

    현재 Visual Studio 에서 inline 용법은 조금 더 있습니다.

    관련 내용은 아래 링크로 대신하겠습니다.

    http://blog.naver.com/sorkelf?Redirect=Log&logNo=40133645107

    2012년 5월 10일 목요일 오후 2:30
  • 이미 좋은 답변이 달려서 그냥 지나쳤다가, 그냥 참고하시면 좋을듯하여 글을 남깁니다. 보통 함수가 호출될때, 함수의 인자를 넘기고
    함수가 복귀하기 위해서 필요한 정보를 저장하기 위에 Stack 에 정보를 기록하는데 이 과정을 Stack Frame 이라고 하며
    이 과정을 알아두면 왜 함수 호출이 오버헤드가 큰지 이해할수 있고 함수 포인터를 사용하여 재미 있는 응용도 할수 있습니다.

     

    바쁘시면 패스해도 되는 내용이지만, 시간나실때 읽어보시면 도움이 되실겁니다.

     

    *. 스택 프레임(Stack Frame)에 대하여 - Step 1  :  http://www.tipssoft.com/bulletin/tb.php/FAQ/618

    *. 스택 프레임(Stack Frame)에 대하여 - Step 2  :  http://www.tipssoft.com/bulletin/tb.php/FAQ/619

      

    *. 함수의 포인터(Function Pointer)에 대하여  :  http://www.tipssoft.com/bulletin/tb.php/FAQ/614

    *. 함수 포인터를 이용한 프로그램 실행속도 높이기  :  http://www.tipssoft.com/bulletin/tb.php/FAQ/627

     

    2012년 5월 11일 금요일 오전 1:20
    중재자

모든 응답

  • inline 은 키워드가 맞습니다. 역할은, 해당 함수에 정의된 코드를 함수를 호출하는 측에 그대로 복사해서 컴파일 해줍니다.

    예를 들어, 제시한 예제에서 다음과 같이 TESTHR 을 호출한다면,

    void MyFunc()
    {
       HRESULT hr = 0;
      TESTHR(hr);
      TESTHR(hr);
    }

    inline 함수의 경우에는 다음과 같이 펼쳐져서 컴파일이 됩니다.

    void MyFunc()
    {
      HRESULT hr = 0;
      if FAILED(hr) _com_issue_error(hr);
      if FAILED(hr) _com_issue_error(hr);
    }

    이렇게 해주는 이유는, 함수 호출에 따른 오버헤드를 없애기 위해서입니다.


    2012년 5월 10일 목요일 오전 4:30
  • 우리가 연산을 위해서 사용하는 CPU 의 경우에는

    함수를 호출할 때, CPU의 상태 정보를 저장하고 복구하는 작업을 내부적으로 수행합니다.

    이렇게 개발자가 의도하지 않았지만, 자동적으로 코드가 생성되어서 실행되는 루틴을 오버헤드라고 부릅니다.

    당연히 CPU 관련 명령어가 추가되었기 때문에 이론적으로는 느려질 수 있습니다.

    ( CPU가 굉장히 빠르기 때문에, 이런 것 때문에 '느리다' 라고 체감하기는 어렵습니다.^^ )

    inline 을 사용하게 되면 이러한 별도의 저장하고 복구하는 코드를 생성하지 않고,

    해당 함수들의 코드를 바로 명령어화 해버리기 때문에 성능에 이점이 생깁니다.

    현재 Visual Studio 에서 inline 용법은 조금 더 있습니다.

    관련 내용은 아래 링크로 대신하겠습니다.

    http://blog.naver.com/sorkelf?Redirect=Log&logNo=40133645107

    2012년 5월 10일 목요일 오후 2:30
  • 이미 좋은 답변이 달려서 그냥 지나쳤다가, 그냥 참고하시면 좋을듯하여 글을 남깁니다. 보통 함수가 호출될때, 함수의 인자를 넘기고
    함수가 복귀하기 위해서 필요한 정보를 저장하기 위에 Stack 에 정보를 기록하는데 이 과정을 Stack Frame 이라고 하며
    이 과정을 알아두면 왜 함수 호출이 오버헤드가 큰지 이해할수 있고 함수 포인터를 사용하여 재미 있는 응용도 할수 있습니다.

     

    바쁘시면 패스해도 되는 내용이지만, 시간나실때 읽어보시면 도움이 되실겁니다.

     

    *. 스택 프레임(Stack Frame)에 대하여 - Step 1  :  http://www.tipssoft.com/bulletin/tb.php/FAQ/618

    *. 스택 프레임(Stack Frame)에 대하여 - Step 2  :  http://www.tipssoft.com/bulletin/tb.php/FAQ/619

      

    *. 함수의 포인터(Function Pointer)에 대하여  :  http://www.tipssoft.com/bulletin/tb.php/FAQ/614

    *. 함수 포인터를 이용한 프로그램 실행속도 높이기  :  http://www.tipssoft.com/bulletin/tb.php/FAQ/627

     

    2012년 5월 11일 금요일 오전 1:20
    중재자