Re: empty base optimization и множественное наследование
От: Николай Ивченков  
Дата: 29.08.09 23:33
Оценка:
Аноним 691:

А>вот цитата из "Эффективное использование С++" Скотта Мэйерса:

А>

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

к сожалению, автор только ссылается на некие правила С++ и не дает никаких комментариев по этому поводу...


Возможно, это какие-то неформальные правила Я как-то пытался найти ответ на схожий вопрос: из какого нормативного текста стандарта следует, что два подобъекта, имеющие один и тот же тип и принадлежащие одному и тому же most derived объекту, должны располагаться по разным адресам. Мои поиски так и не увенчались успехом.

#include <iostream>

struct B
{
    B *ptr() { return this; }
};
struct D : B
{
    B b;
};

int main()
{
    D d;
    std::cout << (d.ptr() == d.b.ptr()) << std::endl; 
}

Может ли равенство d.ptr() == d.b.ptr() быть истинным? Согласно примечанию в 10/5, не может, но примечания не являются нормативными, и разработчики компиляторов вправе их игнорировать. В данном случае VC++ 8.0 и Intel C++ 11.0 располагают data member и базовый подобъект по одному адресу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.