swapsappu Ответов: 3

Зачем нужно больше памяти в следующем коде?


#include "stdafx.h"
#include "string.h"
#include "stdlib.h"

int _tmain(int argc, _TCHAR* argv[])
{
	typedef struct _NODE
	{
		int			iIndex;
		char		cData;
		bool		bFinal;			
		_NODE		*pNextNode;
	}NODE,*LPNODE;
		

	NODE	objRoot;
	NODE	*pNewNode = NULL, *pCurrentNode = NULL;	
	int		iDummy = 0x00;

	memset(&objRoot,0x00,sizeof(NODE));
	objRoot.bFinal = false;
	objRoot.iIndex = iDummy;
	objRoot.cData = 'a';
	objRoot.pNextNode = NULL;
	pCurrentNode = &objRoot;

	for(iDummy = 0x00; iDummy < 1000000; iDummy++)
	{
		pNewNode = (NODE *)calloc(0x01,sizeof(NODE));
		
		if (pNewNode)
		{
			pNewNode->iIndex = iDummy;
			pNewNode->bFinal = false;
			pNewNode->cData = 'a';
			pNewNode->pNextNode = NULL;

			pCurrentNode->pNextNode = pNewNode;
			pCurrentNode = pCurrentNode->pNextNode;

			
			
		}
		else
		{
			break;
		}
	}
	return 0;
}


Что я уже пробовал:

после выполнения этого кода тогда нужна память (частный рабочий набор) 70800 к как это возможно
см. раздел в обозревателе процессов.

3 Ответов

Рейтинг:
2

Jochen Arndt

Структура занимает 12 байт с 32-битными сборками и, вероятно, 20 байт с 64-битными сборками (я этого не проверял).

Но выделенная память также должна управляться. Для этого требуется, по крайней мере, сохранить адрес, размер (или адрес следующего блока) и флаг (используется / свободен). При отладочных сборках обычно существуют дополнительные байты для обнаружения переполнения буфера. Сколько байтов используется управлением памятью, можно ответить только при проверке соответствующего исходного кода стандартной библиотеки Си.

Таким образом, вы получили 70,8 млн использованной памяти для 1 млн элементов. Вы можете попробовать его с различными вариантами сборки (32/64 бит, отладка/выпуск, упаковка структуры), чтобы увидеть, как это влияет на использование памяти.

Что вы должны были узнать:
Неэффективно выделять много небольших блоков в куче.


Рейтинг:
0

Richard MacCutchan

for(iDummy = 0x00; iDummy < 1000000; iDummy++)

Вы выделяете миллион узлов, каждый из которых занимает 128 байт (256 в 64-битной системе). А чего ты ждешь?


swapsappu

Я ожидаю, что для этого кода будет использоваться 11 Мб памяти.

Richard MacCutchan

Вы не можете оценить, что выделит Windows, поскольку она использует свои собственные правила для создания адресного пространства. Помимо элементов, которые вы выделяете, есть пространство кода, управляющие таблицы Windows, библиотеки DLL и т. д.

Рейтинг:
0

Member 13456259

Вы столкнулись с проблемой фрагментации памяти. Вы должны попробовать использовать наиболее подходящее управление памятью..