• inline

    2014. 12. 17.

    by. xxx123


    함수 본체를 직접 코드에 붙여서 호출 관련 오버헤드 비용을 줄일 수 있는 키워드이다.

    하지만 컴파일러는 인라이닝을 단순한 제안의 일종으로 받아들인다.

    밑에서 설명할 __forceinline도 상황에 따라 받아들여지지 않을 수 있는것이다.




    1. 키워드


    inline 과 _inline과 __inline은 모두 같은 키워드이다.

    inline은 C++에서만 지원하며 __inline은 C, C++ 모두 지원한다.

    컴파일러가 자동으로 비용/효율을 분석해서 이득이 있는 경우에만 인라이닝을 한다.


    __forceinline은 컴파일러의 비용/효율 분석 대신 프로그래머의 판단을 우선시 한다.

    즐, 컴파일러의 판단 없이 무조건 inline화 하라는 강요식 키워드이다.






    2. 함수가 inline되지 않는 상황


    다음의 경우는 __forceinline을 사용해도 인라인 되지 않는 상황이다.



     가상 함수이고 이것을 부모 포인터 형식으로 호출하는 경우

           - 동적으로 호출되기 때문에 컴파일 단계에서 무엇인지 알수 없다.

           - 단 자식이 자식 본연의 타입으로 호출하는 가상함수(virtual이 붙은 함수)는 인라이닝이 가능하다.



    ② 재귀함수의 경우

           - 함수가 얼마나 깊은 Depth의 재귀 호출을 할지 모르고, 안다고 하더라도 코드의 크기가 커지므로 안하는것이 낫다.

           - #prgma inline_recursion(on)이 되어 있는 경우에 한해 16depth까지 인라이닝이 된다고는 하지만 코드의 크기때문에               인라인화 하지 않는게 좋다.



    ③ 가변인자 목록을 가진 함수

            - 몇 개의 파라미터를 가질 지 컴파일러가 알수 없기 때문에 인라이닝 실패.



    ④ 함수 포인터를 통해 함수를 호출하는 경우



    ⑤ 함수와 함수호출자가 서로 다른 예외처리를 하는 경우.

           - 예를 들면 , 함수는 C++ exception handling을 하고, 호출자는 SEH를 사용하는 경우. 



    만약 __forceinline으로 선언된 함수를 인라인하지 못할 경우 Level1경고(4714)를 던진다.





    [참고]

    http://msdn.microsoft.com/ko-kr/library/vstudio/z8y1yy88(v=vs.110).aspx

    http://sweeper.egloos.com/3015420

    'Programming > C/C++' 카테고리의 다른 글

    전역(global)변수와 정적(static)변수  (4) 2015.06.24
    Virtual Table (가상함수 테이블)  (0) 2014.12.18
    CreateThread & _beginthreadex  (0) 2014.11.02
    new operator, operator new, placement new  (0) 2014.07.18
    shared_ptr  (0) 2014.06.20

    댓글