2012-04-30 2 views
2

정확히 가상 함수 테이블이 C++ 클래스에 저장되는 위치를 찾으려고했습니다. 나는 "함수 포인터의 정적 배열" 과 같은 답변을 찾았으므로 데이터 세그먼트의 읽기 전용 메모리에 저장됩니까? (초기화 된 것)C++ 클래스의 가상 함수 테이블은 어디에 저장됩니까?

+7

구현이 정의되었습니다. 표준은 vtable _at all_가 존재할 필요조차 없으며, 컴파일러는 가능한 경우 다른 방법으로 가상 상속을 구현할 수 있습니다. – leftaroundabout

답변

2

아마도 그렇습니다. 그러나 그것은 의무 사항은 아닙니다. 다형성이 가상 함수 테이블을 통해 구현되는 것은 아니지만 대부분의 플랫폼에서 그렇습니다. 이것은 구현 세부 사항입니다. 컴파일러가 표준에 따라 설정된 동작을 따르는 한 원하는 모든 작업을 수행 할 수 있습니다.

vftable은 클래스 당 하나이며 메모리의 한 곳에만 저장됩니다.

+0

컴파일러가 런타임 다형성을 달성하는 데 사용할 수있는 다른 방법은 무엇입니까? – saumitra

+0

@saumitra는 효율적이지 않지만 각 인스턴스는 메소드에 대한 포인터 모음을 가질 수 있습니다. –

+0

"하나의 장소 만 기억"은 일반적이지만 확실히 보편적이지는 않습니다. DLL을 사용하면 여러 복사본을 만들 수 있습니다. 바라건대 동일하지만 ODR 위반과 그 Undefined Behavior는 심각하게이를 깨뜨릴 수 있습니다. – MSalters

1

가상 함수를 만들면 컴파일러에서 클래스 내에 vptr을 삽입합니다. 결과적으로 클래스 크기는 Win32에서 4 바이트 씩 증가합니다.이 포인터는 가상 테이블 (vtable)의 주소를 보유합니다. vtable은 컴파일 타임에 컴파일러에 의해 생성되며 기본적으로 함수 포인터 배열입니다. 함수 포인터는 실제로 특정 클래스의 가상 함수에 대한 포인터입니다. 더 정확히 말하면 가상 테이블은 함수 포인터의 정적 배열이므로 같은 클래스의 여러 인스턴스가 해당 vtable을 공유 할 수 있습니다. 정적 멤버는 데이터 섹션 (.data)에 저장되므로 vtable은 실행 파일의 데이터 섹션에도 저장됩니다.

0

구현에 따라 다릅니다.

g ++ (4.9.0)의 경우 가상 테이블 (포인터가 아님)은 ELF 파일의 .rodata 섹션과 해당 세그먼트 LOAD의 메모리에 저장됩니다.

관련 문제