#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 байт памяти»? Это было бы неправильно.