empty base optimization и множественное наследование
От: Аноним  
Дата: 29.08.09 06:50
Оценка: 1 (1)
доброго времени суток!
вот цитата из "Эффективное использование С++" Скотта Мэйерса:

Но имейте в виду, что в общем случае оптимизация EBO применяется только для одиночного наследования. Действующие в С++ правила размещения объектов в памяти обычно делают невозможной такую оптимизацию, если производный класс имеет более одного базового.

Тэг CODE не предназначен для цитирования!!! И делайте предпросмотр.
— Кодт
к сожалению, автор только ссылается на некие правила С++ и не дает никаких комментариев по этому поводу... за сим обращаюсь к Вам — почему в случае impl_0, impl_1, impl_2 и impl_4 компилятор реализовал EBO, а в случае с impl_3 — нет? указывать на то, что в impl_3 empty_base_0 и empty_base_1 следуют друг за другом не нужно. нужно объяснить почему этот факт мешает компилятору реализовать EBO
class empty_base_0
{ };
class empty_base_1
{ };
class storage
{ int                i; };

class impl_0 : public empty_base_0
{ int                g; };
class impl_1 : public empty_base_0, public storage
{ };
class impl_2 : public empty_base_0, public storage
{ int                g; };
class impl_3 : public empty_base_0, public empty_base_1, public storage
{ int                g; };
class impl_4 : public empty_base_0, public storage, public empty_base_1
{ int                g; };

int                _tmain(int argc, _TCHAR* argv[])
{
    int                iSize = 0;
    iSize            = sizeof(impl_0);    // 4
    iSize            = sizeof(impl_1);    // 4
    iSize            = sizeof(impl_2);    // 8
    iSize            = sizeof(impl_3);    // 12
    iSize            = sizeof(impl_4);    // 8
    return 0;
}
empty base optimization ebo
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.