C++ - 가상함수의 inline화에 대해서
출처: Web의 어딘가…
혹시 가상함수는 inline 되지 않는다고 생각하는 사람이 있을 것이다.
경우에 따라서 되기도 하고 안 되기도 한다.
되는 경우는 컴파일 시점에서 어떤 클래스의 가상함수를 사용하는지 알 수 있느냐 이다.
아래 코드의 경우 컴파일 시점에서 Delived 클래스의 Function 멤버를 사용한다는 것을 알 수 있기 때문에 가상함수인 Function은 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;
}
그럼 아래 코드의 Function 멤버는 Inline화 할 수 있을까?
물론 된다.
이유는 이것도 컴파일 시점에서 어떤 클래스의 Function을 사용하는지 알 수 있기 때문이다.
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화 할 수 없다.
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;
}
이 글은 2020-09-09에 작성되었습니다.