c++에서 가상 함수 테이블 처리

개요



만나서 반갑습니다. 첫 게시물입니다.
평상시는 일로 게임 프로그래머를 하고 있어, 집에서는 취미로 게임 엔진(라이브러리)을 제작하기도 합니다.
지금까지 귀찮아 발신 등 별로 하고 있지 않았습니다만, 자신의 스킬 업을 위해서도 앞으로는 여러가지 투고해 나가려고 생각합니다.
대부분은 게임에 관한 기사가 될 것이라고 생각합니다.

하테나 블로그도 하고 있습니다만 그쪽에도 비슷한 기사를 투고를 할지도 모릅니다.

별로 문장을 쓰지 않는 인생을 보내 왔기 때문에 망설임이 된다고 생각합니다만 잘 부탁합니다.

1. 가상 함수 테이블이란?
2. 가상 함수 테이블을 얻어 봅니다.
3. 취득한 곳에서 무엇에 사용하는가
4.뒤로

1. 가상 함수 테이블이란?



가상 함수 테이블이란 ↓
htps : // 그럼.ぃきぺぢ아. 오 rg/우우키/%에 4% 에 b% 에 %에 6% 83% B3% 에 9% 96% 에 2% 에 6% 95% B0% 에 3% 83% 86% 3% 83% 96% 에 3% 83% 오 B

다형성을 실현하기 위해 만들어진 함수의 주소를 가진 배열입니다.
멤버 함수에 virtual 한정자를 붙이면 테이블에 함수 주소가 추가되어 호출할 때 그것을 참조하는 것으로 실현되고 있습니다.

2. 가상 함수 테이블을 얻어 봅니다.



(내 환경은 win/msvc이므로 다른 환경이라면 잘되지 않을지도 모릅니다)

main.cpp
class Base
{
public:
virtual void Func1(){}
virtual void Func2(){}
};

class Child : public Base
{
public:
virtual void Func2()override{}
};

int main()
{
Child* object = new Child();
const void* const* vTable = *reinterpret_cast<const void** const*>(object );

return 0;
}

vTable의 내용


vTable[0]의 Base::Func1 주소
1은 Child::Func2 주소
2는 끝이므로 null 주소
저장
소멸자도 상속하면 동일하게 저장됩니다.

3. 취득한 곳에서 무엇에 사용하는가



가상 함수 테이블을 가져와 함수를 상속하는지 여부와 unity의 SendMessge와 같은 문자열로 함수를 호출할 수도 있습니다. (가상 함수 만 호출 할 수 있지만)

후자의 장점은 개인적으로 별로 느끼지 않지만, 전자의 계승하고 있는지 알 수 있는 것은 꽤 장점이라고 생각합니다.

예를 들어 unity의 behavior 클래스에서는 가상 함수로서 start, update, lateUpdate 등이 정의되어 있습니다. 내용은 비어 있으므로 서브 클래스가 상속하지 않는 한 호출할 필요가 없습니다.
start는 여전히 좋지만, update 등 매 프레임 불리는 함수는 오버헤드가 걸려, 상속하지 않는 경우 내용이 없는데 호출하는 것은 낭비입니다.

덧붙여서 내가 작성하고 있는 엔진에서는 Behavior 등록시에 상속 관계를 체크해, 상속하고 있지 않는 함수는 호출하지 않게 하고 있습니다.

상속 관계는 테이블의 함수 주소가 기본 클래스의 함수 주소를 가리키는지 여부로 알 수 있습니다.

실제로 하기 위해서는 아직 필요한 것이 있습니다만 이번은 여기까지 해 두려고 생각합니다.
또 기회가 있으면 씁니다.

4.뒤로



첫 게시물로 많은 수요가 있는지 잘 모르겠습니다.
아니면 게임과 관련이 없습니다.
하지만 붙이는 태그가 없기 때문에 붙입니다.

게임 엔진을 만드는 동지가 있다면 도움을 주시면 감사하겠습니다.

자신은 지식이 많지는 않지만 앞으로 열심히 노력하고 싶습니다.

그럼!

좋은 웹페이지 즐겨찾기