накладные расходы на виртуальное наследование
От: IROV..  
Дата: 13.08.09 15:51
Оценка:
class A
{
public:
    int a;

public:
    void aa(){};
};

class B
    : virtual public A
{
public:
    int b;

public:
    void bb(){};
};

class C
    : virtual public A
{
public:
    int c;

public:
    void cc(){};
};

class D
    : public B
    , public C
{
public:
    int d;

public:
    void dd(){};
};

void main()
{
    D d;

    d.a = 1;
    d.b = 2;
    d.c = 3;
    d.d = 4;

    d.aa();
    d.bb();
    d.cc();
    d.dd();
}


Вопрос: вот в main я начал работать с классом у которого есть виртуальное наследование, сетапить мемберы, вызывать функции.

какойто оверхед на эти вызовы наложило виртуальное наследование?
я не волшебник, я только учусь!
Re: накладные расходы на виртуальное наследование
От: Ovl Россия  
Дата: 13.08.09 16:36
Оценка:
IRO>какойто оверхед на эти вызовы наложило виртуальное наследование?

никакое. просто сетапя D::B::A.a и D::C::A.a компилятор приходит к одному и тому же месту в памяти.
никаких виртуальных таблиц и тому подобных фич — не используется
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: накладные расходы на виртуальное наследование
От: Аноним  
Дата: 13.08.09 19:41
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>какойто оверхед на эти вызовы наложило виртуальное наследование?

на эти никакой. Доступ к А из Б и Ц будет с оверхедом
Re[2]: накладные расходы на виртуальное наследование
От: IROV..  
Дата: 14.08.09 07:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, IROV.., Вы писали:


IRO>>какойто оверхед на эти вызовы наложило виртуальное наследование?

А>на эти никакой. Доступ к А из Б и Ц будет с оверхедом

Как понять доступ, можно пример?
я не волшебник, я только учусь!
Re[3]: накладные расходы на виртуальное наследование
От: Programador  
Дата: 14.08.09 09:09
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Как понять доступ, можно пример?


void B:bb()
{  A::a=0;
}

Смещение A::this к B::this может отличаться от A::this к D::B::this а код B:bb() общий
Re[4]: накладные расходы на виртуальное наследование
От: IROV..  
Дата: 14.08.09 11:09
Оценка:
Здравствуйте, Programador, Вы писали:

P>Здравствуйте, IROV.., Вы писали:


IRO>>Как понять доступ, можно пример?


P>
P>void B:bb()
P>{  A::a=0;
P>}

P>Смещение A::this к B::this может отличаться от A::this к D::B::this а код B:bb() общий
ок но это же не динамическое смещение? почему компилятор не может сделать

this_A
this_BCD



хорошо а между BCD накладных расходов нет?
я не волшебник, я только учусь!
Re[5]: накладные расходы на виртуальное наследование
От: Programador  
Дата: 14.08.09 11:49
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>хорошо а между BCD накладных расходов нет?


B знает C и D во время компиляции, а А они не знают все. Б может быть чистый Б или Б в составе какогото пятого Ж, который в другом исходнике и наследует А еще и через Ё.
Re[6]: накладные расходы на виртуальное наследование
От: IROV..  
Дата: 14.08.09 13:01
Оценка:
Здравствуйте, Programador, Вы писали:

P>B знает C и D во время компиляции, а А они не знают все. Б может быть чистый Б или Б в составе какогото пятого Ж, который в другом исходнике и наследует А еще и через Ё.


Я понимаю вот в питоне эту проблему решили http://www.python.org/download/releases/2.3/mro/

какие ограничения в плюсах не дают мне расположить в памяти ABCD линейно?

я не волшебник, я только учусь!
Re[7]: накладные расходы на виртуальное наследование
От: Programador  
Дата: 14.08.09 13:14
Оценка: +1
Здравствуйте, IROV.., Вы писали:

IRO>какие ограничения в плюсах не дают мне расположить в памяти ABCD линейно?


IRO>


Одновременно с АС линейно ?
Эти ограничения за пределами стандарта
Re[8]: накладные расходы на виртуальное наследование
От: IROV..  
Дата: 14.08.09 13:18
Оценка:
Здравствуйте, Programador, Вы писали:

P>Одновременно с АС линейно ?

P>Эти ограничения за пределами стандарта

Ладно буду еще думать спасибо за наводку
я не волшебник, я только учусь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.