Post List

2015년 1월 4일 일요일

[C++] inline 함수의 제한사항 관련

* inline 함수의 제약조건
- inline 함수 내에서는 루프문(do whie, while, for), switch, goto문을 사용할 수 없다.
- inline 함수호출시 호출되기 전에 먼저 inline 함수가 정의되어 있어야 한다.
- inline 함수 내에서 재귀호출을 할수 없다.
- inline 함수는 한 수식 내에서 두 번이상 호출될수 없다.
- 함수 포인터로 inline 함수의 주소를 취할 수 없다.
- inline 함수는 호출방식이 아니라 치환전개방식이기 때문이다. 
[-] Collapse
#include<iostream>
using namespace std;

static int i=3;

inline int show();

class A
{
private :
    int i;
    double x;
public:
    inline int show();
};

int main()
{
    show();
    i=5;
    show();

    A test;
    test.show();
    return 0;
}

int A::show()
{
        cout << "cl" << "\n";
        static int i=3;
        i--;
        if(i>0)
        show();
        else return 0;
}

int show()
{
    int a=10;
    cout << "re" << endl;
    i--;
    if(i>0)
    show();
    else return 0;
}


이 소스는 인라인 함수의 재귀호출을 했고
정의 부분을 뒤에 선언하였고..
한블럭에서 두번이상 호출했습니다.
하지말라는것을 거의다 해봤는데 다 됩니다...
왜 그런것일까요?

1 .클래스 내부에서는 기본적으로 함수를 인라인으로 취급을 한다
2 .또 인라인 함수의 구현에 어긋나면 그냥 일반함수로 취급을 한다

inline 은 강제로 이 함수가 인라인이어야 한다고 하는 것이 아니라 inline 이었으면 좋겠다고 컴파일러에게 알려주는 지시자로 알고 있습니다. 그리고 클래스 선언 내부에 멤버함수의 구현이 있다면 인라인을 시도하는 것으로 알고 있습니다.
그리고, 컴파일러는 inline 이 있는 함수를 인라인하지 못했을 경우 경고 메시지를 출력하고, 만약 인라인하지 못했을 경우에는 일반 함수처럼 취급된다고 알고 있습니다.
inline 의 효용성과 문제점, 조심해야 할 점은 meyers 의 effective 시리즈에 기술되어 있습니다. 참고하시기 바랍니다.
 

댓글 없음:

댓글 쓰기