Вычисление объема памяти, используемого программой CPP

#c #windows

#c #Windows

Вопрос:

 struct Player
{
    char* nameptr;
    float x=0, y=0, z=0;
    float angle = 0.0;
    int health = 100;
    int armour = 0;
    int weapon = 0;
};
Player players[100];
 

Привет, int равен 4 байтам, float также равен 4 байтам. указатель также равен четырем байтам. Итак, в основном 8 * 4 = 32 байта.
3200 байт — это примерно 3 КБ.
Итак, использует ли эта программа после строки, в которой мы объявляем массив, 3 КБ оперативной памяти?
Спасибо

Комментарии:

1. std::cout << sizeof(players) << std::endl; точно знает, сколько места занимает массив.

2. Вероятно, нет. Определенный объем памяти также используется для инструкций, которые будут работать с различными структурами, для кода запуска (включая инициализацию стандартных потоков, таких как std::cout и std::cin ) и т.д. Кроме того, ваши 100 экземпляров Player , вероятно, бесполезны, если nameptr каждый элемент не инициализирован, чтобы указывать на что- то , и это что- то потребляет память в той или иной форме.

Ответ №1:

Для вашей структуры я бы сказал, что вычисления в порядке, возможно, указатель может быть 8 байт для x64.

Вы также должны знать #pragma pack , что может изменить ситуацию. Я предполагаю, что вы не использовали этот или эквивалентный переключатель компилятора.

Кроме того, все изменится, когда вы new разместите игроков в куче, а не создадите их в стеке. Куча имеет некоторые накладные расходы, и эти накладные расходы зависят от того, создаете ли вы сборку выпуска или сборку отладки. Это также зависит от того, запускаете ли вы его в отладчике или нет.

Но есть нечто большее, чем просто вычисление этих чисел. В системе Windows программа будет

  • загрузка ntdll.dll
  • загрузка kernelbase.dll
  • загрузка kernel32.dll
  • загружается wow64.dll , если скомпилирован как 32-разрядный
  • загрузите исполняемый файл
  • может быть, загрузить еще больше библиотек DLL, например msvcrt , при использовании компилятора Microsoft
  • создайте стек размером 1 МБ (ИМХО, это зависит от настроек компилятора, но по умолчанию используется 1 МБ)
  • создайте кучу по умолчанию размером 1 МБ

таким образом, общий объем используемой памяти намного выше.

Далее, не вся память должна находиться в оперативной памяти. Его части могут быть перенесены на диск, и это может измениться в любое время. Если вы хотите измерить его, взгляните на показатель «Размер рабочего набора» (кстати, это довольно плохой показатель).

Итак, реальный ответ — это новый вопрос: что вы на самом деле имеете в виду, спрашивая «сколько оперативной памяти используется»? Почему вы хотите это знать и что вы хотите сделать с числом, которое является результатом?

Комментарии:

1. Это делается для создания программы NPC для игры (многопользовательской игры Vice City). Итак, в этой программе мне нужно сохранить имя, здоровье, координаты местоположения и идентификаторы оружия. Поэтому я подумал, что могу использовать массивы. Максимум 100 игроков. (99 без учета npc). Итак, я хочу создать массив, и память также должна потребляться меньше, потому что пользователь может запускать много копий одной и той же программы. т. е. около 10 npc с разными идентификаторами.

2. @HabiHaris: это прекрасно. Говорите ли вы своим клиентам: «Когда вы посмотрите на диспетчер задач, вы увидите, что используется 3200 байт памяти»? Это было бы неправильно.