Я хочу сохранить 3 свойства 1000 прямоугольников. Я могу сделать это двумя разными способами. Я могу использовать структуру или массив, но я пытаюсь выяснить, какое решение использует меньше всего памяти. Вот код:
struct Figure {
unsigned int color;
virtual void foo() {}
};
struct Rectangle : public Figure {
unsigned int width,height;
};
int main() {
Rectangle r[1000];
unsigned int r2[1000][3]; //This take less memory, The first entry is rectangle number
// the next is color, width and height
std::cout<<"Type name is "<< typeid(r[0]).name() <<sizeof(r2)<<" "<<sizeof(r)<<std::endl;
return 0;
}
Результат:
Имя типа 9Rectangle12000 24000
Как видите, массив объектов структуры использует вдвое больше памяти, чем простой массив. Почему это так? Я ожидал, что массив структур в моем случае будет использовать больше памяти из-за полиморфной структуры, но не так много.





В вашей структуре есть виртуальные функции, поэтому там есть vptr.
Между членами и / или в конце структуры может быть отступ для целей выравнивания.
Выравнивание определенно играет роль, вы можете убедиться, сравнив 4 беззнаковых целых числа вместо 3. Размер массива увеличивается, но размер структуры остается прежним. Moreso, сравнение неполиморфной структуры с 4 беззнаковыми целыми числами с тем же эквивалентным массивом не приводит к накладным расходам.
Я согласен, что это как-то связано с заполнением, но как насчет полиморфной структуры? Разве мой массив прямоугольников не должен всегда использовать больше памяти, чем эквивалентный массив? В моем случае даже с 4 беззнаковыми int я получаю накладные расходы, массив использует всего 16000 байт.
Я предполагаю, что это связано с байтами заполнения и функциями-членами (не присутствующими в массиве unsigned int)