Наследование RTTI в C ++ приводит к увеличению размера класса - PullRequest
0 голосов
/ 12 мая 2009

В C ++ проблема проста.

У меня есть 2 класса, один содержит другой как часть его реализации.

struct A
{
    void do_something()
    {
    };
};

struct B
{
    A obj_A;
    void hello_world()
    {
    };
};

Теперь проблема в том, что структура B на один байт больше, если A является частью B, когда я делаю sizeof (B) и объект типа B. A на 100% собирается включать только не виртуальные члены (без виртуальных) таблица обязательна) и нет необходимости в проверке типа. Есть ли способ (например, директива компилятора) полностью удалить ненужный байт из B, но при этом получить доступ к функции-члену A через B?

Я могу только предположить, что дополнительный байт - это компилятор, добавляющий символ * к имени А. "A", но любые другие идеи могут быть полезны.

Ответы [ 2 ]

4 голосов
/ 12 мая 2009

sizeof (A) не может быть 0, потому что каждая часть объекта должна быть "адресуемой" (то есть, у нас должен быть другой адрес, когда мы используем оператор &)

struct A
{
};

struct B
{
    A m_a1;
    A m_a2;
};

void test()
{
    B b;
    A* pa1 = &b.m_a1;
    A* pa2 = &b.m_a2;

    // "pa1" need to be different from "pa2" 
}
2 голосов
/ 12 мая 2009

К сожалению, вы не упоминаете компиляторы.

В любом случае, в коде, который вы публикуете, класс A является кандидатом на "Оптимизацию пустого базового класса". Это является частью стандарта C ++, в котором говорится, что базовый класс без переменных-членов можно оптимизировать так, чтобы он не занимал байтов.

B должен по стандарту C ++ занимать пространство, так как содержит хотя бы один член (а именно obj_A).

Вы можете получить доступ к функции-члену A непосредственно из B, вызвав do_something (). Никакая магия не нужна.

...