정확히 가상 함수 테이블이 C++ 클래스에 저장되는 위치를 찾으려고했습니다. 나는 "함수 포인터의 정적 배열" 과 같은 답변을 찾았으므로 데이터 세그먼트의 읽기 전용 메모리에 저장됩니까? (초기화 된 것)C++ 클래스의 가상 함수 테이블은 어디에 저장됩니까?
2
A
답변
2
아마도 그렇습니다. 그러나 그것은 의무 사항은 아닙니다. 다형성이 가상 함수 테이블을 통해 구현되는 것은 아니지만 대부분의 플랫폼에서 그렇습니다. 이것은 구현 세부 사항입니다. 컴파일러가 표준에 따라 설정된 동작을 따르는 한 원하는 모든 작업을 수행 할 수 있습니다.
vftable
은 클래스 당 하나이며 메모리의 한 곳에만 저장됩니다.
1
가상 함수를 만들면 컴파일러에서 클래스 내에 vptr을 삽입합니다. 결과적으로 클래스 크기는 Win32에서 4 바이트 씩 증가합니다.이 포인터는 가상 테이블 (vtable)의 주소를 보유합니다. vtable은 컴파일 타임에 컴파일러에 의해 생성되며 기본적으로 함수 포인터 배열입니다. 함수 포인터는 실제로 특정 클래스의 가상 함수에 대한 포인터입니다. 더 정확히 말하면 가상 테이블은 함수 포인터의 정적 배열이므로 같은 클래스의 여러 인스턴스가 해당 vtable을 공유 할 수 있습니다. 정적 멤버는 데이터 섹션 (.data)에 저장되므로 vtable은 실행 파일의 데이터 섹션에도 저장됩니다.
0
구현에 따라 다릅니다.
g ++ (4.9.0)의 경우 가상 테이블 (포인터가 아님)은 ELF 파일의 .rodata 섹션과 해당 세그먼트 LOAD의 메모리에 저장됩니다.
관련 문제
- 1. 상속 클래스의 C++ 가상 함수
- 2. SQL Server 2008 : 변경 내용 추적 테이블은 어디에 저장됩니까?
- 3. 가상 테이블은
- 4. C++ 가상 함수 성능
- 5. .db 파일은 어디에 저장됩니까?
- 6. HttpSession 데이터는 어디에 저장됩니까?
- 7. jquery는 어디에 저장됩니까?
- 8. 코코아 - NSCoding은 어디에 저장됩니까?
- 9. 메모리 정적 변수는 어디에 저장됩니까?
- 10. MediaTemple (dv) vhosts 구성 파일은 어디에 저장됩니까?
- 11. struct 구조체에서 파생 된 클래스의 가상 함수
- 12. 이 관리 객체는 어디에 저장됩니까?
- 13. 가상 함수 호출 오버 헤드는 어디에 있습니까?
- 14. C++ (가상) 함수 표
- 15. C++ 가상 함수 숨김
- 16. 가상 함수 C#
- 17. 키 체인 데이터는 어디에 저장됩니까?
- 18. Java HttpSession 속성은 어디에 저장됩니까?
- 19. mysqlimport - 가져온 데이터는 어디에 저장됩니까?
- 20. 오브젝트 반사 정보는 어디에 저장됩니까?
- 21. JavaScript의 localstorage 문자열은 어디에 저장됩니까?
- 22. 함수의 반환 값은 어디에 저장됩니까?
- 23. Java System Packages는 어디에 저장됩니까?
- 24. 페이지 보호 변수는 어디에 저장됩니까?
- 25. Sharepoint - .cs 파일은 어디에 저장됩니까?
- 26. Alfresco PDF 미리보기는 어디에 저장됩니까?
- 27. AnkhSVN CA 인증서는 어디에 저장됩니까?
- 28. Visual Studio 레이아웃은 어디에 저장됩니까?
- 29. Firefox IndexedDB 파일은 어디에 저장됩니까?
- 30. 캡처 한 이미지는 어디에 저장됩니까?
구현이 정의되었습니다. 표준은 vtable _at all_가 존재할 필요조차 없으며, 컴파일러는 가능한 경우 다른 방법으로 가상 상속을 구현할 수 있습니다. – leftaroundabout