혹시 가상함수는 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
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
OS 버전 확인 (0) | 2013.09.27 |
---|---|
[C/C++] malloc과 new의 차이점 (0) | 2013.07.04 |
콘솔 창 한줄로 띄우기 (0) | 2013.06.09 |
static_cast와 dynamic_cast의 속도 비교 (0) | 2013.06.04 |
가상 메모리 할당 함수(VirtualAlloc), 예약, 확정, 보호속성, 대용량 메모리 할당 (0) | 2013.05.24 |