Я прочел (http://www.nobugs.org/developer/win32/debug_crt_heap.html), что HeapAlloc выделяет некоторую память для учета в дополнение к запрошенному блоку памяти. Размер бухгалтерской информации должен составлять 40 байтов (8 байтов до блока и 32 после).
Тем не менее, когда я запускаю тест с моим VS2010, фактическое потребление памяти оказывается значительно меньше.
Например, я вставляю 1М целых в набор. Я написал функцию ловушки для malloc, чтобы убедиться, что каждая вставка запускает отдельный запрос на динамическое выделение памяти для создания нового узла. Один узел, согласно хуку, занимает 20 байтов. Если мы добавим 80 байтов служебной информации, общий объем памяти для одного узла должен составить 100 байтов. То есть набор должен потреблять ~ 100 мегабайт, в то время как согласно TaskManager это занимает всего 32 мегабайта.
Поэтому у меня есть следующие вопросы:
Действительно ли накладные расходы 40 байтов?
Применяются ли накладные расходы к каждому блоку HeapAlloc?
Это, кажется, вызывает путаницу. Я не уверен, показывает ли диспетчер задач физическую или виртуальную память.
Если ваши распределения собираются поменять файл, они могут не отражаться в диспетчере задач. Вы должны попробовать более продвинутые инструменты мониторинга производительности.
Я уверен malloc
я не ожидаю, что HeapAlloc вызывает для каждого выделения. Конечно, в случае с glibc ОС вызывается только для того, чтобы дать больший кусок памяти, и это делится — с меньшими издержками, чем накладные расходы на выделение ОС.
Вы можете проверить это, потратив время на malloc
против вызова HeapAlloc
миллион раз для небольшого блока памяти (например, 20 байтов). Что занимает больше времени? Если HeapAlloc быстрее, то вполне вероятно, что HeapAlloc
призван для каждого malloc
— но я ожидаю, что malloc
значительно быстрее.