示例程序
示例程序非常简单,仅是声明两个几乎一样的类:一个使用了CFixedAlloc而另一个没用。接下来,创建了大量的对象,创建过程是计时的,完成之后,会显示结果。要计算未用CFixedAlloc的类大小开销,在此使用了__V6_HEAP,这种情况非常少见,因此计算值可能不完全准确,但一般来看,应该是比较正确了。
#define ITER_NUM 1000*1024
class A
{
public:
A( A *next ) : m_next(next) {}
A *m_next;
int dummy1;
int dummy2;
};
class B
{
public:
B( B *next ) : m_next(next) {}
B *m_next;
int dummy1;
int dummy2;
DECLARE_FIXED_ALLOC(B);
};
IMPLEMENT_FIXED_ALLOC(B,ITER_NUM);
void CCFixedAllocDemoDlg::OnTestTimebutton()
{
//可在此添加控件通知处理代码
A *curAObj, *firstAObj = NULL;
B *curBObj, *firstBObj = NULL;
DWORD startA, endA, startB, endB;
register int i;
{
CWaitCursor wait;
startA = GetTickCount();
for( i = 0; i < ITER_NUM; i++ )
{
firstAObj = new A(firstAObj);
}
while( firstAObj )
{
curAObj = firstAObj->m_next;
delete firstAObj;
firstAObj = curAObj;
}
startB = endA = GetTickCount();
for( i = 0; i < ITER_NUM; i++ )
{
firstBObj = new B(firstBObj);
}
while( firstBObj )
{
curBObj = firstBObj->m_next;
delete firstBObj;
firstBObj = curBObj;
}
endB = GetTickCount();
}
displayResult( endA-startA,endB-startB );
}
#define BYTES_PER_PARA 16
void CCFixedAllocDemoDlg::displayResult( DWORD timeA, DWORD timeB )
{
TCHAR buf[1024];
/*
* 每个A对象占用32字节。
*/
int overheadA = (32-sizeof(A))*ITER_NUM;
/*
*首先计算已分配大小,再减去所请求大小。
*/
int overheadB =
(8+sizeof(B)*ITER_NUM + sizeof(CPlex) + (BYTES_PER_PARA-1))
& ~(BYTES_PER_PARA - 1);
overheadB -= sizeof(B)*ITER_NUM;
wsprintf( buf, __TEXT("Creating and destroying %d objects\n")
__TEXT("without CFixedAlloc\t: M ms\n")
__TEXT("with CFixedAlloc\t: M ms\n")
__TEXT("You saved %d bytes with CFixedAlloc"),
ITER_NUM, timeA, timeB,
overheadA - overheadB );
MessageBox(buf,__TEXT("Results"));
}