Информация об изменениях

Сообщение Re: как сократить количество vtbl от 22.04.2017 22:25

Изменено 22.04.2017 22:35 andrey.desman

Re: как сократить количество vtbl
Здравствуйте, qaz77, Вы писали:

Q>Класс выглядит следующим образом:

Q>
Q>class Bar: public IBar1,
Q>           public IBar2,
Q>           ...
Q>           public IBar9
Q>{
Q>  int ref_count;
Q>  unsigned flags;
Q>  ...    
Q>  // реализация IBar1
Q>  virtual void foo1() override;
Q>  ...
Q>};
Q>

Q>Есть ли какой-нибудь паттерн/хак, чтобы "упаковать" несколько виртуальных таблиц в одну.

Есть такой хак, но насколько он применим в твоем случае тебе лучше знать. А хак прост как топор:

class IBar1 {};
class IBar2: public IBar1 {}
class IBar3: public IBar2 {}
...
class Bar: public IBarN
{
Impl;
}
...
PROFIT


Нормальный компилятор в этом случае должен сделать только лишь один указатель на ТВМ класса.
Re: как сократить количество vtbl
Здравствуйте, qaz77, Вы писали:

Q>Класс выглядит следующим образом:

Q>
Q>class Bar: public IBar1,
Q>           public IBar2,
Q>           ...
Q>           public IBar9
Q>{
Q>  int ref_count;
Q>  unsigned flags;
Q>  ...    
Q>  // реализация IBar1
Q>  virtual void foo1() override;
Q>  ...
Q>};
Q>

Q>Есть ли какой-нибудь паттерн/хак, чтобы "упаковать" несколько виртуальных таблиц в одну.

Есть такой хак, но насколько он применим в твоем случае тебе лучше знать. А хак прост как топор:

class IBar1 {};
class IBar2: public IBar1 {}
class IBar3: public IBar2 {}
...
class Bar: public IBarN
{
Impl;
}
...
PROFIT


Нормальный компилятор в этом случае должен сделать только лишь один указатель на ТВМ класса.
Хотя тут private/protected наследование может быть лучше, но это от ситуации зависит.