오늘 알고리즘 모델을 만들다가 전에 작업하던 사람이 특정역할을 하는 함수들을 인라인으로 구현해놓은게 있었다. 특정함수를 인자값과 어떤 플래그를 넣어서 해당 플래그에 따라 특정 인라인 함수를 호출하는 형식인데.
개인적인 생각으로는 펑션포인터를 사용하는게 더욱 좋을거라 생각해서 펑션 포인터로 수정중…
“인라인 함수를 펑션 포인터로 해볼까? …….인라인은 해당코드를 호출한대에 쑤셔 넣는 방식이니깐…… 런타임시 결정되는 펑션포인터를 사용하면!”
(사실 이때부터 부질없을거란 확신을 가지고 있었다. 그냥 심심해서 해본거다.)
그래서 돌려보니깐 슝슝 잘돌아간다.
그래서
“음…컴파일러에서 일반 함수로 컴파일한걸까?”
라고 생각하고 어셈코드를 보니 역시나 call 을 해서 날라간다.
그럼 그냥 인라인은 어떻게 되는 것일까 해서 간단하게 인라인만 짜서 돌렸더니 역시나 call을 해서 날라간다!
“이런 여태까지 C++책은 날 속였나!”
라고 생각해서 영천이형에게 질문… 디버그 모드라서 그런다고 하신다.
……….
그런데 릴리즈 모드에서는 어셈코드를 볼수가 없다 -_-;
(아 물론 비주얼스튜디오에서 보여지는 C++코드 까지 나오는 아름다운 방식으로 볼수가 없다는 의미)
닝기미~어쩌라고~
음 영천이형은 디버깅심볼을 포함하면 어느정도는 볼수 있다고 하셨는데 그건 못찾았고
프로젝트설정 -> C++ -> Optimization -> Optimization 을 Disable 로 놓으면 일단 어셈블 코드를 볼수 있다.
일반적인 릴리즈모드는 아니지만….바이너리 파일 역어셈블해서 보면서 비교해볼 의지는 없는 관계로…
일단 인라인에서 call이 없어지고 그냥 계산이 되는것은 확인
그리고 다음은 인라인을 펑션포인터로 호출 했을때는
여길 보면 call을 호출
음…지금 이걸 테스트 할때부터 이걸 정리할때까지 머리속에서는 당연하잖아 가 맴돌고 있었다.
당연한걸 가지고 뭘또 일일이 -_-; 시간들여 정리하냐고 생각되지만 지금 까지 쓴게 아까우니 마무리…
당연한 결론1
인라인함수도 펑션포인터로 호출하면 최적화이득은 없다.
추가.
혹시 프로젝트설정에서 좀도 최적화 옵션을 준다면 뭔가 달라질까?…….역시 부질없을거라……예상한다…..
추가2.
인라인에서 인라인을 부르면 어떻게 최적화될까? 컴파일러마다 구현사항이 다를듯
좋은 정보였어요.. 도움 열라되는데..
뭘 그리 빠져나갈 구멍을 이리저리 파놓나? 하나도 아니고 말야..ㅋㅋ
아하하 습관인가 봐요.
이것저것 어설프게 알아서 생기는 습관일지도…
릴리즈에서 어셈블리 코드를 원하신다면, .Net 2003기준으로
프로젝트 속성에서 C/C++ -> 출력 파일 -> 어셈블러 출력 설정을 바꾸시면 됩니다. 좍좍 잘 뽑혀 나옵니다.