Выполняя профилирование (память и скорость), я был потрясен тем фактом, что win7, кажется, выделяет ровно вдвое больше оперативной памяти, которую я прошу ... Обратите внимание, что я впервые делаю такое активное профилирование на win7, поэтому я действительно не знаю, чего ожидать.
Я выделяю точное количество ОЗУ в цикле, используя экспресс-версию MSVC под win7 (64-бит). Приложение скомпилировано и работает в 32-битном режиме.
Я выделяю 24 МБ оперативной памяти, и диспетчер задач показывает, что мое приложение использует 48 МБ (во всех столбцах памяти, включая зафиксированные, поскольку я фактически копирую память в новых регионах. ). Когда я получаю еще 24 (должно быть 48 МБ), мое приложение переходит на 96 и т. Д.
Они распределяются как 1 000 000 24-байтовых структур.
Я поискал в сети, но не нашел ничего, что соответствовало бы моим наблюдениям. точно.
Кто-нибудь знает?
Если это всего лишь уловка ОС (или некомпетентность?), есть ли какой-нибудь инструмент, который может дать мне реальное потребление памяти процессом? (сложно найти утечки, когда приложение фонтанирует для начала; -)
[----------- отредактировано, дополнительная информация -----------]
Примечание (по пути в строке заголовка консоли), что я создаю Режим выпуска (с использованием всех «пустых» настроек проекта по умолчанию MSVC 2010), поэтому не выделяется дополнительная «отладочная» память (которая может быть довольно обширной в некоторых проектах).
вот короткое полное приложение C, которое иллюстрирует поведение:
#include <stdio.h>
#include <assert.h>
#include <conio.h>
#include <stdlib.h>
typedef unsigned int u32;
typedef struct myStruct MYS;
struct myStruct {
u32 type;
union {
u32 value;
char * str;
void * data;
MYS ** block;
MYS * plug;
};
u32 state, msg, count, index;
};
int main(int argc, char *argv[]){
int i, j;
MYS *ref;
printf ("size of myStruct: %d\n\n", sizeof(MYS));
for(i=0; i < 10; i ++){
printf("allocating started...\n");
for (j = 0; j < 1000000 ; j ++){
ref = (MYS *) malloc(sizeof(MYS));
assert(ref);
memset(ref, 0, sizeof(MYS));
}
printf(" Done... Press 'enter' for Next Batch\n");
_getch();
}
_getch();
return 0;
}
и изображение, которое показывает память на моей машине после одного цикла. При каждом следующем запуске он добавляет ~ 48 МБ вместо 24 МБ!