Где в памяти хранится vtable?

Где в памяти хранится vtable?

6 ответов

Зависит от компилятора.

В VС++ указатель vtable, хранящийся в начале выделения объекта, перед любыми данными элемента. (Если ваш класс имеет хотя бы одну виртуальную функцию-член.)

Также может быть несколько указателей vtable, если ваш класс умножает-наследует от других классов с помощью vtables.

Сам Vtables статически выделяется где-то в вашем адресном пространстве.

Затем макет объекта выглядит как (для экземпляра C):

A VTable ptr
A member variables.
B Vtable ptr
B member variables.
C member variables.

для гериархии

class A {
 virtual Ax() {}
 int a, b;
};
class B {
 virtual Bx() {}
 int c, d;
};
class C : public A, public B {
 int foo, bar;
};


виртуальные таблицы? Что такое vtable? В стандарте С++ не упоминается vtable. Каждый компилятор может реализовать виртуальные функции по своему усмотрению. И это включает в себя размещение vtable в любом месте, которое ему нравится.


Обычно vptr в начале объекта (Imperfect С++, Backyard Hotrodding С++), но это не гарантируется стандартом. Использование vptrs и vtables в стандарте не гарантируется.

Если вам действительно нужно знать, где это, обычно используют что-то вроде COM, XPCOM, UNO и т.д., которые реализуются, по существу, с заданным местом, где расположено что-то вроде vptr, и устанавливают способы использования их.


Каждый экземпляр, содержащий виртуальную функцию, имеет указатель виртуальной функции, который указывает на таблицу виртуальных функций (vbtl), мы могли бы найти vtbl через экземпляр. или вы можете использовать objdump для чтения символа файла ELF, возможно, вы найдете ответ. Надеюсь, следующий пример поможет вам.

#include <iostream>
#include <stdio.h>
typedef void (*fun_pointer)(void);
using namespace std;
class Test
{
 public:
 Test()
 {
 cout<<"Test()."<</stdio.h></iostream>


Vptr и Vtable сохраняются в сегменте данных...

Vtable похож на массив указателя на функцию.

Vtable и Vptr создают во время компиляции, которая будет получать память во время выполнения, а записи vtable - это адреса виртуальных функций.

Каждый объект класса, содержащего виртуальную функцию, будет иметь дополнительный указатель, который указывает на Виртуальную таблицу, называется виртуальным указателем.

всякий раз, когда мы вызываем виртуальную функцию с использованием объекта, сначала возбуждающий Vptr считывает функцию из Vtable во время выполнения и, наконец, функцию будет вызываться.

licensed under cc by-sa 3.0 with attribution.