혹시 가상함수는 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