Овернех на виртуальное наследование
От: Alexander G Украина  
Дата: 27.06.08 10:13
Оценка: :))
Какие обычно дополнительные накладные расходы по памяти и по скорости вызова на использование виртуального наследования интерфейсов ?

struct ISome
{
  virtual void Some1() = 0;
};

struct ISomeA : virtual public ISome
{
  virtual void Some1A() = 0;
};
 

struct ISomeB : virtual public ISome
{
  virtual void Some1B() = 0;
};


struct Some : virtual public ISome
{
  void Some1() {}
};

struct SomeA : public ISomeA
{
  void Some1A() {}
};


struct SomeB : public ISomeB
{
  void Some1B() {}
};


struct X
  : public Some
  , public SomeA
{
  // Some1A::Some1 перекрыт в Some через dominance
};

struct Y
  : public Some
  , public SomeB
{
  // Some1B::Some1 перекрыт в Some через dominance
};

X x;
Y y;
Русский военный корабль идёт ко дну!
virtual base virtual inheritance interface
Re: Овернех на виртуальное наследование
От: Erop Россия  
Дата: 27.06.08 10:18
Оценка: 8 (1)
Здравствуйте, Alexander G, Вы писали:

AG>Какие обычно дополнительные накладные расходы по памяти и по скорости вызова на использование виртуального наследования интерфейсов


1) лишний уровень косвенности при доступе к виртуальной базе (может быть и не один)
2) скрытый указатель в объекте (тоже может быть два)
3) увеличение размера указателей на члены выведенного класса
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Овернех на виртуальное наследование
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 27.06.08 10:38
Оценка: 8 (1)
Здравствуйте, Alexander G, Вы писали:

AG>Какие обычно дополнительные накладные расходы по памяти и по скорости вызова на использование виртуального наследования интерфейсов ?


Смотри здесь 2.3.6: с рассуждениями, выкладками и цифрами.
Re[2]: Овернех на виртуальное наследование
От: Alexander G Украина  
Дата: 27.06.08 18:53
Оценка:
Здравствуйте, Erop, Вы писали:

E>3) увеличение размера указателей на члены выведенного класса


Интересно, а я думал размер такого указателя не больше размера size_t.
В прочем это не влияет — не собираюсь же я делать сто тысяч bindов

E>1) лишний уровень косвенности при доступе к виртуальной базе (может быть и не один)

E>2) скрытый указатель в объекте (тоже может быть два)

Проверил, пришел к выводу что злоупотреблять виртуальным наследованием не стоит.
Рост размера структур слишком большой.
Я думал, что т.к. дата мемберов в интерфейсах нет, то и места в экзепляре на витуальное наследование не понадобится.
Русский военный корабль идёт ко дну!
Re[3]: Овернех на виртуальное наследование
От: Erop Россия  
Дата: 27.06.08 22:01
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Интересно, а я думал размер такого указателя не больше размера size_t.

AG>В прочем это не влияет — не собираюсь же я делать сто тысяч bindов

Посмотри внимательно на код:
struct A { int I; };
struct B : virtual A { int Q; };
struct C : virtual A { int Z; };
struct D : B, C { int Y; };

int bar( B* b, int B::*p )
{
    return b->*p;
}

void foo()
{
    int B::*p1 = &B::Q;
    int B::*p2 = &B::I;
    D d;
    bar( &d, &B::Q );
    bar( &d, &B::I );
    B b;
    bar( &b, &B::Q );
    bar( &b, &B::I );
}
и поймёшь, что size_t очень легко может оказаться недостаточно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.