nakka soft world !

함수 바인딩과 가상함수의 원리 본문

프로그래밍언어/C++

함수 바인딩과 가상함수의 원리

nakka 2017. 3. 27. 17:37
728x90

함수 바인딩과 가상함수의 원리


함수 바인딩 (function binding)

class Animal

{

public:

void Cry() {}

};

class Dog : public Animal

{

public:

void Cry() {}

};


int main()

{

Animal* p = 0;

p = new Dog;


int n;

cin >> n;


if (n == 1)

p = new Animal;


// 이순간 컴파일러는 p가 누구를 가리키는지 알수 있을까?


p->Cry(); // 함수 바인딩 (function binding)

}


// 1. static binding : 컴파일 시간에 컴파일러가 결정하는 것. 포인터 타입으로 결정. Animal Cry 호출. 속도가 빠름.

// C++ 일반 멤버 함수.

// 2. dynamic binding : p가 가리키는 메모리를 조사하는 기계어 코드 생성. 실행시간 조사 후 호출.

// C++ virtual function, java, object-C




가상함수의 원리 - 가상함수 테이블


class Animal

{

private:

int age;

public:

virtual void Cry() {}

virtual void Run() {}

};

class Dog : public Animal

{

private:

int color;

public:

virtual void Cry() {}

};


int main()

{

Animal a;

Dog d;



cout << sizeof(a) << endl;  // 8

cout << sizeof(d) << endl;  // 12


Animal* p = &d;

p->Cry();   // p->vtptr[1]() 라는 기계어 코드 생성

}


가상함수의 단점

1. 약간의 성능저하. function call하면 direct call하는데 주소를 한번 찾아야 해서 잠깐 느림


2. inline 못씀



728x90
Comments