2007년 02월 26일
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 를 참조
아니다.. 대략 지식적으로만 알고 있었지....
이 내용들은 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 | 2007/02/26 18:05 | C++/STL/Boost/ | 트랙백 | 덧글(2)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
컴파일 옵션에 -pg 를 넣어주고 파일을 만들고 실행을 하면 gm... 라는 파일이 생깁니다.
이걸 가지고 gprof 를 수행하면..(실행파일과 함께) 함수 호출 그래프가 나옵니다. 여기에 함수명이 있으면 inline 이 안된것으로 보는거죠... 좀더 연구해서 계속 리포팅 해볼 생각입니다.