В частности, класс, унаследованный от пустого класса, содержащего только объединение, члены которого включают в себя экземпляр базового класса без данных, занимает больше памяти, чем просто объединение. Почему это происходит и есть ли способ избежать излишней памяти?
Следующий код иллюстрирует мой вопрос:
#include <iostream>
class empty_class { };
struct big : public empty_class
{
union
{
int data[3];
empty_class a;
};
};
struct small
{
union
{
int data[3];
empty_class a;
};
};
int main()
{
std::cout << sizeof(empty_class) << std::endl;
std::cout << sizeof(big) << std::endl;
std::cout << sizeof(small) << std::endl;
}
Вывод этого кода при компиляции с использованием gcc версии 7.3.0, скомпилированной с -std=c++17
(хотя я получаю тот же результат, используя c ++ 11 и c ++ 14), будет:
1
16
12
Я бы ожидал, что классы большой и маленький должны быть одинакового размера; как ни странно, большой занимает больше памяти, чем маленький , хотя они, похоже, содержат одни и те же данные.
Кроме того, даже если размер массива в объединении изменяется, разница между размером большой и маленький составляет 4 байта.
-Edit:
Кажется, что это поведение не специфично для классов с объединенными типами данных. Подобное поведение происходит в других подобных ситуациях, когда производный класс имеет член с типом базового класса. Спасибо тем, кто указал на это.