나는 최근에 C++ 가상 테이블에 대해 의문을 가지고 있습니다.C++에 가상 테이블이 필요합니까?
왜 C++은 가상 테이블을 사용합니까?
=> C++ 컴파일러는 실제 함수 주소
---> 이유를 모르기 때문에?
=> C++ 컴파일러는 정확한 유형 모르기 때문에 (고양이? 개? 동물?) 객체의
에 대한 포인터 "panimal"점 --- 왜? 컴파일러가 객체 유형을 알아낼 수있는 방법이 있습니까?
=> 예, 저는 컴파일러가 추적 객체 유형을 통해이를 수행 할 수 있다고 생각합니다.
개체 포인터가 값을 가져 오는 원본을 생각해 봅시다. 실제로 2 개의 출처.
- 다른 포인터 "또 다른 포인터가"그 값을 얻을 않는 클래스 인스턴스 의
- 주소? 결국에는 "클래스 인스턴스"에서 값을 가져 오는 포인터가 있습니다. 그래서
는 원본 소스 오브젝트에 뒤로 할당 스레드를 추적을 통해
=> 컴파일러는 포인터의 정확한 유형을 알아낼 수있다. => 컴파일러
정확한 함수의 주소가없는 가상 테이블이 필요하지 않습니다 =>
을 호출되는 알고있다.개체 유형 추적은 각 클래스 인스턴스의 가상 테이블 기념품과 가상 테이블 포인터를 저장합니다.
개체 유형 추적이 작동하지 않는 위치는 어디입니까?
라이브러리 링크.
라이브러리 함수가 기본 클래스 포인터를 반환하면 컴파일러에서 원래 소스 객체를 추적 할 수있는 방법이 없습니다. 컴파일러는 아마도 을 라이브러리 코드와 none-library 코드에 맞출 수 있습니다. 내 보낸 라이브러리 클래스의 경우 가상 테이블을 사용하십시오. 다른 클래스의 경우 메모리를 절약하기 위해 오브젝트 유형을 추적하면됩니다.
위의 진술에 오류가 있는지 확실하지 않으므로 친절하게도 지적하십시오. 미리 감사드립니다 ~
간단합니다. 추적은 vtable보다 훨씬 비쌉니다. – ikh
yeath는 컴파일러에서 더 비싸지 만보다 효율적인 실행 코드를 생성합니다. 그리고 대부분의 추적은 몇 파일에서 수행 할 수 있다고 생각합니다. 시간 비용은 그리 크지 않습니다. – Guocheng
아, 죄송합니다. 나는 당신이 꼼수 추적과 같은 것을 말하고 있다고 생각했습니다 :) – ikh