반응형

혹시 가상함수는 Inline 되지 않는다고 생각하는 분들도 아마 있지 않을까 생각하는데 경우에 따라서 되기도 하고 안되기도 합니다.

 

되는 경우는 컴파일 시점에서 어떤 클래스의 가상함수를 사용하는지 알수 있느냐 입니다.

struct Base

{

    virtual void Function(void) const = 0:

};

 

struct Delived

{

    virtual void Function(void) const

    {

         std::cout << "Hello" << std::endl;

    }

};

 

int main(int, char**)

{

    Delived  delived;

    delived.Function();

     return 0;

}

위 코드의 경우 컴파일 시점에서 Delived 클래스의 Function 멤버를 사용한다는 것을 알 수 있디 때문에 가상함수인 Function Inline화 할 수 있습니다.

 

 

struct Base

{

    virtual void Function(void) const = 0:

};

 

void Call( Base &base )

{

    base.Function();

}

 

struct Delived:  public Base

{

    virtual void Function(void) const

    {

         std::cout << "Hello" << std::endl;

    }

};

 

int main(int, char**)

{

    Delived   delived;

    Call( delived );

     return 0;

}

그럼 이 코드의 Function 멤버는 Inline화 할 수 있을까요물론 됩니다이유는 이것도 컴파일 시점에서 어떤 클래스의 Function을 사용하는지 알 수 있기 때문입니다.

 

 

그러나 아래의 코드는 Function 멤버를 Inline화 할 수 없습니다.

struct Base

{

    virtual void Function(void) const = 0:

};

 

struct Delived:  public Base

{

    virtual void Function(void) const

    {

         std::cout << "Hello" << std::endl;

    }

};

 

struct Null  : public Base

{

    virtual void Function(void) const{}

};

 

int main( int argc, char** )

{

    Delived   delived;

    Null        null;

    

    Base  *base = 1 < argc ? static_cast<Base*>( &delived ) : static_cast<Base*>( &null );

     base->Function();

 

    return 0;

}

이유는 설명 안 해도 되겠죠? ^^

 

 

 

출처 : http://d.hatena.ne.jp/anonymouse_user/20120309/1331303971 

 


반응형

+ Recent posts