C++ 에서 인라인 함수는 C 프로그램의 매크로의 문제점을 보완하면서 매크로 처럼 작동하는 함수라고 알고 있습니다.
그리고 매크로는 전처리기에서 처리되고 인라인 함수는 컴파일시 처리된다는것도 알고 있습니다.
하지만 왜 인라인 함수를 재귀호출함수나 인라인 함수안에 loop나 switch 혹은 goto 문을 사용하면 않되는지를 이해하기 가 힘들군요
왜일까요.
제가 알고 있는대로만 답변드리겠습니다. (틀릴 수도 있다는 것이죠)
'사용하면 안된다' 는 부적절한 표현 같습니다.
다만 재귀호출 등을 사용하게 되면 인라인 함수가,
인라인 되지 않고 (즉 호출함수에 임베드 되지 않고)
주소를 가지는 독립함수가 될 것입니다.
왜냐하면 재귀호출을 위해서는,
함수 자신만의 스택프레임이 있어야 하는데, (그래야 로컬 변수를 저장할 곳이 있겠죠)
인라인 되어버리면 호출하는 함수의 스택 프레임내에 포함되게 되겠죠. (추측입니다)
무엇보다 결정적인 이유는 재귀호출할 대상 자체가 실재하지 않기 때문입니다.
inline은 컴퍼일러에게 강제로 할수 있는 성격의 동작이 아닙니다. 심지어 force inline 성격의 키워드를 주더라도 컴파일러가 이에 대해 거부할 수 있습니다.
inline 키워드의 성격을 단순히 컴파일러에게 이 함수는 크기도 작고 많이 쓰이는 함수이니 잘좀 봐줘... -0- 정도의 의미로 이해하시는게 좋을것 같습니다.
VC.net 2003에서는 inline의 적용 예외가 재귀호출과 함수포인터와 연관된 경우로 정의하고 있군요. 물론 언급된 2가지 경우는 inline을 '항상 하지 않는' 경우이며 나머지의 경우에도 컴파일러의 판단에 의해 언제든지 inline 키워드는 무시될 수 있습니다.
MSDN 표현을 참조하면
"The inline keyword tells the compiler that inline expansion is preferred"
"you should not depend on the inline specifier to cause a function to be inlined"
정도를 보시면 될 것 같습니다.
Re: 인라인 함수를 대한 궁금증
제가 알고 있는대로만 답변드리겠습니다. (틀릴 수도 있다는 것이죠)
'사용하면 안된다' 는 부적절한 표현 같습니다.
다만 재귀호출 등을 사용하게 되면 인라인 함수가,
인라인 되지 않고 (즉 호출함수에 임베드 되지 않고)
주소를 가지는 독립함수가 될 것입니다.
왜냐하면 재귀호출을 위해서는,
함수 자신만의 스택프레임이 있어야 하는데, (그래야 로컬 변수를 저장할 곳이 있겠죠)
인라인 되어버리면 호출하는 함수의 스택 프레임내에 포함되게 되겠죠. (추측입니다)
무엇보다 결정적인 이유는 재귀호출할 대상 자체가 실재하지 않기 때문입니다.
loop, switch, goto 문에 대해서는 글쎄요. :?
즐겁게 살아 볼까나~*
inline은 컴퍼일러에게 강제로 할수 있는 성격의 동작이 아닙니다. 심
inline은 컴퍼일러에게 강제로 할수 있는 성격의 동작이 아닙니다. 심지어 force inline 성격의 키워드를 주더라도 컴파일러가 이에 대해 거부할 수 있습니다.
inline 키워드의 성격을 단순히 컴파일러에게 이 함수는 크기도 작고 많이 쓰이는 함수이니 잘좀 봐줘... -0- 정도의 의미로 이해하시는게 좋을것 같습니다.
VC.net 2003에서는 inline의 적용 예외가 재귀호출과 함수포인터와 연관된 경우로 정의하고 있군요. 물론 언급된 2가지 경우는 inline을 '항상 하지 않는' 경우이며 나머지의 경우에도 컴파일러의 판단에 의해 언제든지 inline 키워드는 무시될 수 있습니다.
MSDN 표현을 참조하면
"The inline keyword tells the compiler that inline expansion is preferred"
"you should not depend on the inline specifier to cause a function to be inlined"
정도를 보시면 될 것 같습니다.
1) goto, switch 문 같은 경우는 inline 함수를 컴파일하
1) goto, switch 문 같은 경우는 inline 함수를 컴파일하는 시점에는 분기 주소를 알수 없고 실제 inline 함수가 확장되는 시점에야 판별이 가능하다는 문제점.
2) loop의 경우는 컴파일러 내부적으로 inline 에 대한 평가에서 이 함수는 loop를 포함할 정도의 크기가 큰 함수이므로 inline이 적절하지 않다고 판단하여 inline을 거부한 경우.
3) 재귀 함수의 경우는 freezm7님의 언급대로 인라인 함수에 대한 재귀호출 처리의 구현의 어려움 정도가
인라인 처리가 힘든 이유가 되겠네요...
그런데 요렇게 복잡한 함수라면 굳이 inline 키워드를 사용하지 않으시는게 더 좋으실거 같은데요 ^^;
감사합니다.도움이 많이 되었습니다.
감사합니다.
도움이 많이 되었습니다.
--------------
Burning Blue!
--------------
댓글 달기