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

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

25
задан Guy Avraham 23 November 2017 в 12:57
поделиться

4 ответа

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

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

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

Сами vtables статически размещаются где-то в вашем адресном пространстве .

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

A's VTable ptr
A's member variables.
B's Vtable ptr
B's member variables.
C's 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;
};
41
ответ дан 28 November 2019 в 18:29
поделиться

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

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

2
ответ дан 28 November 2019 в 18:29
поделиться

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

16
ответ дан 28 November 2019 в 18:29
поделиться
3
ответ дан 28 November 2019 в 18:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: