이글루스 로그인


inline 함수에 대한 잘 못된 생각들.

 
대부분의 사람들이 알고 있는 내용이지만... 나는 잘 몰랐다.

아니다.. 대략 지식적으로만 알고 있었지....

이 내용들은 gcc /g++ 4.0 상에서 테스트 된 내용이므로 참고 하길 바란다.

1) 함수 이름앞에 inline 을 붙인다고 해서 반드시 inline 이 되는것은 아니다.

    대개 이 문장에서 생각 드는것은 덩치가 큰 함수는 inline 이 안될수도 있다는 이야기 이다.

    근데 gcc 상에서 -O1 -O2 ... 등 최적화 옵션을 주지않고 컴파일 하면... inline 이 되지 않는다...

   ( 대문자로 꼭 써야한다... 실수로 -o1 하면 대략 난감한 경험을 ㅠ.ㅠ )

   다른 컴파일러는 어케 되늦지 모르겠지만....

   어떻게 확인했냐 하면... gprof 를 통해서 확인했다..... 최적화 옵션을 주지 않으니까.....

   해당 함수가 call-graph 상에 나타 나더군... 옵션을 주니...나타 나지 않더라....

   여기에서 핵심은 이거다... 반드시 inline 화 하고 싶다면... gprof등 으로 함수 호출을 확인해봐야 한다.

   책만 믿고... 최적화 옵션을 주지 않고 inline 을 썻다면... OTL 할수도 있다.

   gcc -S 옵션으로 어셈블리 파일이 나오는데 여기서 call 명령어가 있는지 살펴보는 것도 좋다.

   ( 글 쓰고 1일 지나서 알게됨 ㅠ.ㅠ )

2)  생성자 , 소멸자가 클래스 내에서 inline 으로 선언 되었다면.....

    이 생성자,소멸자의 본체는 클래스 내에서 선언되거나...다른 헤드파일에 있어...

    이 객체를 사용하는 입장에서는 컴파일 시점에서 본체가 보여야 한다.. 무조건

    만일 멤버 변수가 inline 으로 선언되었고... 선언된 함수가 호출된 시점에서 함수의 본체가 보이지 않는다면

   (컴파일러에 의해...링커가 아니다 !!! ) 에러다...컴파일러....

   하지만 inline 이 선언만 되고 호출되지 않는다면 문제가 없었다.

3) 동일 클래스 멤버함수간의 호출시는 어떻게 될까

    호출하는 입장에서 inline 으로 선언된 함수의 본체가 보인다면 inline 된다.

    (
      본체가 보인다는 의미는 해당 함수,멤버함수가 동일한 컴파일 모듈에 포함되면 된다
      동일 소스 파일에서 inline 함수가 호출 하는 함수보다 뒤에 있어도 문제 될것은 없다.
    )


결론 :: inline 으로 선언된 함수가 정말로 inline 으로 호출되는지 확인해보자 ㅋ

ps) inline 함수에 대해 좀더 많은 지식을 원하면 Effective C++ 8 , 9 , 10 장을 확인하면 되겠다 ㅡ,.ㅡ;;

http://kldp.org/node/37636 를 참조

by Gerald | 2007/02/26 18:05 | C++/STL/Boost/ | 트랙백 | 덧글(2)

트랙백 주소 : http://kicom95.egloos.com/tb/961659
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by object at 2007/02/26 18:45
인라인은 cost-benefit analysis를 해서 득이 될 때만 하는 것 같습니다. 저도 정말 정확하게 어떤 경우에 인라인이 되는지 감을 못 잡겠어요. 그래서 정말 크리티칼한 경우엔 아주 #define으로 매크로로 처리해버리죠. MSVC에는 __forceinline이라는 것도 있긴한데 여전히 명쾌하지는 않습니다.
Commented by Gerald at 2007/02/26 20:25
책에 설명은 쉽게 하는데... 막상 그렇게 알고 써도...아닐때가 있습니다. gnu 계열에 grof 라는 도구가 있습니다
컴파일 옵션에 -pg 를 넣어주고 파일을 만들고 실행을 하면 gm... 라는 파일이 생깁니다.
이걸 가지고 gprof 를 수행하면..(실행파일과 함께) 함수 호출 그래프가 나옵니다. 여기에 함수명이 있으면 inline 이 안된것으로 보는거죠... 좀더 연구해서 계속 리포팅 해볼 생각입니다.

:         :

:

비공개 덧글


◀ 이전 페이지          다음 페이지 ▶