Почему класс использует столько памяти по сравнению с массивом в C++

Я хочу сохранить 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

Как видите, массив объектов структуры использует вдвое больше памяти, чем простой массив. Почему это так? Я ожидал, что массив структур в моем случае будет использовать больше памяти из-за полиморфной структуры, но не так много.

Я предполагаю, что это связано с байтами заполнения и функциями-членами (не присутствующими в массиве unsigned int)

Clonk 12.06.2018 17:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. В вашей структуре есть виртуальные функции, поэтому там есть vptr.

  2. Между членами и / или в конце структуры может быть отступ для целей выравнивания.

Выравнивание определенно играет роль, вы можете убедиться, сравнив 4 беззнаковых целых числа вместо 3. Размер массива увеличивается, но размер структуры остается прежним. Moreso, сравнение неполиморфной структуры с 4 беззнаковыми целыми числами с тем же эквивалентным массивом не приводит к накладным расходам.

Rotem 12.06.2018 17:34

Я согласен, что это как-то связано с заполнением, но как насчет полиморфной структуры? Разве мой массив прямоугольников не должен всегда использовать больше памяти, чем эквивалентный массив? В моем случае даже с 4 беззнаковыми int я получаю накладные расходы, массив использует всего 16000 байт.

user2304458 12.06.2018 17:50

Другие вопросы по теме