inline 와 template 선언 위치..
글쓴이: ssehoony / 작성시간: 금, 2004/03/19 - 11:32오전
inline 키워드의 경우 헤더파일과 소스파일에 사용할 수가 있는데
만약 헤더 파일에서, 함수 선언 파일 앞에 inline 를 붙였는데
소스파일의 정의 부분에서는 inline 를 붙이지 않는 다면 어떻게 되나요?
인라인함수로 간주가 되는건지 아닌건지 궁금하네요.
반대로 헤더에는 넣지 않고 소스파일에만 넣는다면 어떻게 되나요?
왠지 헤더파일을 따라 갈 것 같은데 어떻게 되는지 궁금하네요.
template 같은 경우는 어떻게 되나요?
그리고 함수 call 의 부하를 줄이기 위해 inline 을 사용한다고 하는데
함수 call 을 위해 어셈차원에서 몇개의 레지스터를 push/pop 하는게
그렇게 부하가 심한 일인가요? 아니면 그것 말고 다른 작업도 있는건가요?
Forums:
말씀하신대로 직접 해보시면 한방에 알수 있을것 같은데요.
말씀하신대로 직접 해보시면 한방에 알수 있을것 같은데요.
산넘어 산
템플릿이야 compile 에서 에러를 낼 법도 한데inline 같은
템플릿이야 compile 에서 에러를 낼 법도 한데
inline 같은 경우는 inline 함수로 만들 수 없을 경우 비inline 함수로
컴파일을 해버립니다. 특별히 에러문구를 컴파일에서 내주지 않습니다.
그래서 선언적인 문제로 inline 된건지 안된건지 알 수가 없네요.
Re: inline 와 template 선언 위치..
어떤 경우를 생각하시는지 모르겠지만 참고로 아래의 경우는 인라인이 될 수 없습니다.
이것은 a.c 파일의 함수 앞에 inline 키워드를 추가해도 마찬가지 입니다.
이유를 설명하자면..
가령 컴파일러가 main.c 를 컴파일 한다고 해보지요.
그럼 (1) 의 시점에서 a() 의 본체를 알고 있어야만 인라인으로 넣던가 말던가 하겠지요?
a() 의 본체를 알려면 어떻게 해야 할까요? a.o 를 뒤져야 할까요?
하지만 항상 a.c 가 먼저 컴파일 된다는 보장이 있을까요?
강제적으로 a.c 를 먼저 컴파일 되게 한다.. 라는 방법이 있을수도 있겠지요.
하지만 만약 a.c 에서는 main.c 에 있는 b() 를 인라인 하고싶어한다면...?
문제가 많지요..? ^^
정리하자면,
이미 함수의 본체에 대한 정보를 컴파일러가 이미 알고있는 경우가 아니라면
인라인 함수로 동작하기가 힘들다.. 라고 보시면 됩니다.
인라인 함수를 사용 하기전에 인라인 함수 본체를 그 위에 놓으셔야 합니다.
그것이 헤더이던 소스파일이던 말이지요.
( 좋은 컴파일러는 같은 파일 내에 있다면 본체가 뒤에 있어도 연결해 주긴 합니다만.. )
참고로 인라인 되었는지 안되었는지 여부는 디스어셈블 해서 call 이 일어나는지를 검사해보면 알 수 있겠지요.
댓글 달기