'[Public] 프로그래밍/C++'에 해당되는 글 3건

  1. 2010.01.25 인라인 함수(Inline Function) <C++ #1> (1)
2010.01.25 22:49


인라인 함수에 대해서 알아보장


책에서는  인라인 함수를 다음과 같이 정의하고 있다.

다음 같이 인라인 함수를 선언 하면
#include <iostream>
using namespace std;
inline void Func()
{
cout << "나 인라인 함수 임?" <<endl;
}
void main()
{
Func();
}

다음과 같은 효과를 얻을 수 있다고
#include <iostream>
using namespace std;
void main()
{
cout << "나 인라인 함수 임?" <<endl;
}

즉 인라인을 함수에 붙이면 메인안에다 그냥 쓴거랑 같다는건데..

1. 이게 어디에 도움이 될가 ?
 - 성능과 관련이 있는데 함수로 넘어가는 작업을 생략할 수 있다.
 - 보기 좋게 코딩이 된다 ?
 - 그러면 전부 인라인 함수로 선언하면 되지 않냐 그러면 문제점이 생긴다.
 - 프로그램의 크기가 커진다는 것이다. 그러면 메모리에 올라갔다 내려왔다 하는 일이 자주 생겨 
   수행속도가 떨어질 수 있다.

머 이정도와 

2. 인라인 함수를 만드는 법
 - 클래스 내부에 정의한 멤버함수는 모두 자동으로 인라인 함수가 된다.
 - 클래스 외부에 정의한 멤버 함수는 정의 앞에 inline 키워드를 붙인다.
 - 인라인 함수는 반드시 헤더파일에 있어야 한다. (cpp 파일에 있음 오류 발생)
 - 인라인함수 헤더 없어도 되던데요?  ( cpp만 구현햇을때 경우 그리고 허용 되더라도 보통함수로 만들어 버린다.)

이정도 나와 있어 우리가 알고 있다.

.......

하지만 우리는 좀더 자세히 알아야한다.
자 다음 내용을 보자

이것은 1999 년 iso/iec9899 : 1999가 출간되다 보통 C99라 부른다.


인라인 함수의 정의는 이거다. 
함수 호출의 비용을 막고, 컴파일 시점에 코드 내용을 그대로 삽입하여 해석되는 용도로 사용되는 한정어
흠.... 어렵구만
해석을 좀더 해봐야겠따.

자 먼저 알아야 할게 함수 호출 비용이다.
함수 호출 비용이란 함수를 호출하기 위하여 컴파일러가 자동으로 생성하는 코드의 일부이다.
보통 함수 호출 전을 Prefix라 함수 호출 후 종료 다음을 Suffix 라 한다. 
그럼 Prefix와 Suffix를 왜 알아야 하나 이는 함수 호출전에 CPU의 레지스터 상태, 플래그 등을 스택에 저장하는 코드를 실행하는 작업이다.
컴파일러에 의해 자동으로 생성되어 함수 호출 앞에 붙는다.
그러므로 이는 실행속도를 저하시킨다.

자 두번째로 알아야 할 내용은 Runtime과 Compile time이다.
먼저 Runtime은 실행 도중이고
CompileTime은 컴파일 도중이란 말이다. 

그러면 Inline 함수는 언제 실행이 될가?
그렇다 컴파일 타임에 결정이 되는 것이다.
컴파일을 하는 도중 코드가 치환되어 호출에 들어가는 오버헤드를 줄여주는 것이다.
그러면 당연히 속도가 향상되는 것이다.
그럼 위에서 책에서 간단하게 성능이 좋아진다의 이유를 알게 된 것이다.

자 말로만 들으면 못 믿을 이를 위해 디스어셈블로 한번 봐 보장....

먼저 이것은 위의 예제 그냥 함수 선언이다.


다음으로 위의 예제  Inline 함수를 선언 했던 함수다.

확연한 차이를 느낄수가 있음을 알 수 있다. 


자 이제 인라인 함수가 먼지 알았다.
근데 여기서 한가지 의문이 생긴다. 

매크로 함수도 있는데 어떤게 빨라요 ? 
매크로 함수도 역시 컴파일 타임이다. 하지만 다른점이라고는
모든형에 동작하는 매크로보다 인라인 함수가 유연성이 떨어진다는 것이다. 

그럼 우리는 여기서 어떻게 인라인 함수를 좀더 효율적으로 사용할 수 있을가? 궁금증이 생길 것이다.
이때 사용하는게 템플릿 이다.
이게 좀 더 들어가면 템플릿을 사용하다가 문제점이 생기고 함수객체 개념이 생기고 하는 과정이 생기다 좀더 편하게 사용하기 위해서 곧 나올 C++0x의 람다 개념까지 가게된다. 
이거에 대한 설명은 나중에 글을 쓰도록 하겠다. 우선 여기까지만 알아도 될것 같다.

그럼 인라인함수의 주의사항을 나열해보장

 - 자동 인라인  보다는 명시적인 표시하라  (소스의 가독성을 높이기 때문)
 - 파일크기가 일반적으로 커진다. 
 - 작은 크기의 함수는 오히려 작아진다.
 - 작은 함수는 분명히 빨라진다.
 - 파일 크기가 줄어들기에 캐시 메모리에 올라 올때 유리하다.
 - 큰 함수는 캐시의 hit를 떨어뜨려 오히려 속도가 줄어 든다.
 - 그래서 작고, 자주 호출되는 함수에 사용하고 권장 라인은 3~5 라고 한다.
 - 남용시 목적코드의 커짐에 따라 페이징 적중 횟수 증가 및 캐시 적중률이 떨어진다.
 - 클래스의 헤더와 구현 부분이 다른 경우 항상 헤더에 정의하자 (호출하는 파일과 동일 컴파일 단위에 있어야 함)

이정도면 Inline 함수가 머냐고 물어보면 대답을 할 수 있을것이다.



Posted by 차출발 차출발

댓글을 달아 주세요

  1. 열혈강의자 2014.08.29 13:41  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.. 저도 inline이 반영되었는지 확인하고 싶어서 검색하다가 들어왔는데요..
    위에 디스어셈블 한 내용에 inline이 적용된 부분이 어떤 부분인가요?

    인라인 선언하지 않아도 똑같이 나오는데 말예요..

    제가 알기로는 compilie되면서 치환되어야 한다고 알고 있는데
    위에는 main에서 Func() 함수를 call 하는 일반적인 코드 같아 보여요..

    혹시 위의 어셈블 이미지에서 어느 부분이 인라인화(치환) 되었는지 알려주시면 감사하겠습니다.