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]; }