Windows通过VirtualAlloc和VituralFree来控制虚拟空间中的region。在Jeffery的Progamming Applications For Windows中,提到了这样一个关于VirtualAlloc和VituralFree的用例:
有一个大稀疏矩阵,如果用普通的多维数组存储,可能会浪费大量空间。如果用链表结构来实现,算法会相对复杂。有了VirtualAlloc和VirtualFree可以先reserve一个地址空间,作为这个virtual矩阵,矩阵的实际空间仅当使用时才会分配。
下面的程序就是实现了这样一个矩阵,实现了setElement和getElement两个操作。
#include "StdAfx.h"
#include "VirtualMatrix.h"
VirtualMatrix::VirtualMatrix(int nRows, int nCols):
m_pdata (NULL),
nCols(0),
nRows(0)
{
this->nCols = nCols;
this->nRows = nRows;
m_pdata = VirtualAlloc (NULL, nRows*nCols*sizeof(int), MEM_RESERVE, PAGE_READWRITE );
if (m_pdata == NULL)
{
MessageBox(NULL, TEXT("reserve failed"), TEXT("virtual matrix"), MB_OK);
return;
}
}
VirtualMatrix::~VirtualMatrix(void)
{
if (m_pdata != NULL)
VirtualFree (m_pdata);
}
void VirtualMatrix::setElement(int i, int j, int value)
{
if (i < 0 || i >= nRows)
return;
if (j < 0 || j >= nRows)
return;
int * p = (int*)(m_pdata);
doAgain:
__try
{
*(p + i*nCols+j) = value;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
VirtualAlloc (LPVOID((long long)m_pdata+sizeof(int)*(i*nCols+j)), 10, MEM_COMMIT, PAGE_READWRITE );
goto doAgain;
}
}
int VirtualMatrix::getElement(int i, int j)
{
if (i < 0 || i >= nRows)
return -1;
if (j < 0 || j >= nRows)
return -1;
__try
{
int * p = (int*)(m_pdata);
int val = *(p + i*nCols+j);
return val;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return -1;
}
}