Почему в VTT есть top_offset, реализованный gcc? - PullRequest
0 голосов
/ 13 мая 2018

Вот подробное описание VTT * в ответе с наибольшим количеством голосов. Но ответ не объясняет, почему в VTT есть top-offset.

С моей точки зрения, когда мы down_cast указатель base на указатель derived, компилятор уже знает, что offset необходимо отрегулировать во время компиляции (когда есть нет виртуального деривации), поэтому нет необходимости хранить top_offset в ситуации ниже:

class A {
public:
  int a;
};
class B {
public:
  int b;
  virtual void w();
};

class C : public A, public B {
public:
  int c;
};

В этом случае объекты типа C размещаются следующим образом (числа предполагают 32-разрядные указатели):

                           +-----------------------+
                           |     0 (top_offset)    |//why?
                           +-----------------------+
c --> +----------+         | ptr to typeinfo for C |
      |  vtable  |-------> +-----------------------+
      +----------+         |         A::v()        |
      |     a    |         +-----------------------+
      +----------+         |    -8 (top_offset)    |//why?
      |  vtable  |---+     +-----------------------+
      +----------+   |     | ptr to typeinfo for C |
      |     b    |   +---> +-----------------------+
      +----------+         |         B::w()        |
      |     c    |         +-----------------------+
      +----------+

Почему в VTT top_offset присутствует в такой ситуации? Я думаю, top_offset и virtual base offset необходимы только для виртуального наследования.

1 Ответ

0 голосов
/ 15 мая 2018
void *top(B *b) { return dynamic_cast<void *>(b); }

Компилятор не может определить во время компиляции, каково правильное смещение.Эта функция может вызываться с нулевым указателем, указателем на завершенный объект B или указателем на подобъект B.Три случая должны быть обработаны по-разному.Смещение в виртуальной таблице - это то, что позволяет этому работать.

...