Я попытался найти, где именно таблица виртуальных функций хранится для класса C++. Я нашел несколько ответов, таких как его «статический массив указателей на функции» , так что он будет храниться в памяти только для чтения данных? (инициализированный)Где хранится таблица виртуальных функций для класса C++?
ответ
Скорее всего, да. Однако это не предусмотрено. Даже не утверждается, что полиморфизм реализуется через таблицу виртуальных функций, но на большинстве платформ он есть. Это детали реализации, если компилятор подчиняется поведению, установленному стандартом, он может делать все, что захочет.
A vftable
по одному на класс и хранится только в одном месте в памяти.
Каковы другие способы использования компилятором для достижения полиморфизма времени выполнения? – saumitra
@saumitra не эффективен, но каждый экземпляр 'мог' иметь набор указателей на методы. –
«Только одно место в памяти» является общим, но, конечно, не универсальным. С DLL вы можете получить несколько копий. Надеемся, что идентичные, но нарушения ODR и их Неопределенное поведение могут сильно нарушить это. – MSalters
Когда вы производите любую виртуальную функцию, компилятор будет вставлять vptr внутри вашего класса. В результате размер класса будет расти на 4 байта (на Win32). Этот указатель содержит адрес виртуальной таблицы (vtable). vtable создается компилятором во время компиляции и в основном представляет собой массив указателей на функции. Указатели функций фактически указывают на виртуальные функции этого конкретного класса. Точнее, виртуальная таблица представляет собой статический массив указателей на функции, поэтому разные экземпляры одного и того же класса могут совместно использовать эту таблицу. Поскольку статические члены хранятся в разделе данных (.data), vtable также сохраняется в разделе данных исполняемого файла.
Это зависит от реализации, да.
И для g ++ (4.9.0) виртуальная таблица (а не указатель) сохраняется в разделе .rodata файла ELF и соответствующем сегменте LOAD в памяти.
- 1. Где хранится таблица виртуальных методов в C++?
- 2. Наследование от класса C++ без виртуальных функций
- 3. Синтаксис для виртуальных функций
- 4. C++ наследование виртуальных функций
- 5. синтаксис для вызова виртуальных функций вне класса?
- 6. Принцип виртуальных функций в C++
- 7. Безопасное переопределение виртуальных функций C++
- 8. Наследование виртуальных функций
- 9. Роль компилятора для виртуальных функций в C++
- 10. C++ с использованием виртуальных функций
- 11. C++ виртуальная таблица функций стоит
- 12. C++ виртуальных функций неожиданного поведения
- 13. C++ Получить таблицу виртуальных функций.
- 14. C++ виртуальных функций, связывающих причудливо
- 15. концепция виртуальных функций в C++?
- 16. концепция виртуальных функций в C++
- 17. Для двоичных файлов C#, где хранится информация типа анонимного класса?
- 18. Динамическое связывание виртуальных функций в C++
- 19. виртуальных функций объект нарезка
- 20. Вызов виртуальных функций внутри функций-членов
- 21. Связывание виртуальных функций
- 22. Несколько наследующих/виртуальных функций
- 23. Смещение таблицы виртуальных функций
- 24. Шаблон команды без виртуальных функций (C++)
- 25. Где хранится метод класса и класса?
- 26. Избегание виртуальных функций
- 27. Альтернатива для функций виртуальных шаблонов
- 28. Определение чистых виртуальных функций вне определения класса
- 29. Где хранится таблица векторов прерываний в Linux?
- 30. Узнайте, где таблица SQL хранится на диске
Реализация определена. Стандарт даже не требует наличия каких-либо vtable _at all_, компиляторы могли бы реализовать виртуальное наследование другими способами, если бы обнаружили, что это возможно. – leftaroundabout