Какие обычно дополнительные накладные расходы по памяти и по скорости вызова на использование виртуального наследования интерфейсов ?
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;
Здравствуйте, Alexander G, Вы писали:
AG>Какие обычно дополнительные накладные расходы по памяти и по скорости вызова на использование виртуального наследования интерфейсов
1) лишний уровень косвенности при доступе к виртуальной базе (может быть и не один)
2) скрытый указатель в объекте (тоже может быть два)
3) увеличение размера указателей на члены выведенного класса
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexander G, Вы писали:
AG>Какие обычно дополнительные накладные расходы по памяти и по скорости вызова на использование виртуального наследования интерфейсов ?
Смотри здесь 2.3.6: с рассуждениями, выкладками и цифрами.
Здравствуйте, Erop, Вы писали:
E>3) увеличение размера указателей на члены выведенного класса
Интересно, а я думал размер такого указателя не больше размера size_t.
В прочем это не влияет — не собираюсь же я делать сто тысяч bindов
E>1) лишний уровень косвенности при доступе к виртуальной базе (может быть и не один) E>2) скрытый указатель в объекте (тоже может быть два)
Проверил, пришел к выводу что злоупотреблять виртуальным наследованием не стоит.
Рост размера структур слишком большой.
Я думал, что т.к. дата мемберов в интерфейсах нет, то и места в экзепляре на витуальное наследование не понадобится.
Здравствуйте, 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 очень легко может оказаться недостаточно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском