All pastes #472494 Raw Edit

Anonymous

public cpp v1 · immutable
·published 2007-05-05 16:57 UTC
rendered paste body
	static CompileTreeNode* Allocate()	{		if (GC.size())		{			CompileTreeNode* res = GC.front();			GC.pop();			ZeroMemory(res, sizeof(*res));			*res = CompileTreeNode();			return res;		}		const int LOAD = 4096*64;		numNodes++;		if ((numNodes % 100000) == 0)			cout << "Nodes: " << numNodes << endl;		typedef pair< CompileTreeNode*, int > Buffer;		typedef list< Buffer > Buffers;		static Buffers nodes;		if (nodes.size() == 0 || (nodes.back().second == 0))		{			// need new			nodes.push_back(Buffer());			CompileTreeNode* &buffer = nodes.back().first;						buffer = (CompileTreeNode*)VirtualAlloc(0, sizeof(CompileTreeNode) * LOAD, MEM_COMMIT, PAGE_READWRITE);			MEMORY_BASIC_INFORMATION memInfo;			VirtualQuery(buffer, &memInfo, sizeof(memInfo));			nodes.back().second = (int)(memInfo.RegionSize / sizeof(CompileTreeNode));			totalMem += memInfo.RegionSize;#ifdef _DEBUG			unsigned int lost = memInfo.RegionSize - nodes.back().second * sizeof(CompileTreeNode);			if (lost)				cout << lost << " bytes wasted" << endl;			if (nodes.back().second != LOAD)				cout << (nodes.back().second - LOAD) * sizeof(CompileTreeNode) << " recovered" << endl;	#endif			for (int i = 0; i < nodes.back().second; i++)				buffer[i] = CompileTreeNode();					}		Buffer &buffer = nodes.back();		buffer.second--;		return &buffer.first[buffer.second];	}