信息化 频道

企业信息化成功 要素及风险状况分析


    在Alloc()中,代码会检查要释放的内存池是否为空,如果为空,则创建一个新的内存块(CPlex),并设置要释放节点列表,在此,因为是直接放置到每个块中,所以就没有多余的空间来放置节点信息。当然了,要正常工作,m_nAllocSize必须要大过sizeof(CNode),这也是为什么要在构造函数里进行检查的原因:ASSERT(nAllocSize >= sizeof(CNode))。
如果大家看过CRT代码,可能有点搞不清楚CFixedAlloc的代码为什么会很少,从算法的观点来看,主要是因为内存块的大小是固定的,比方说,在可进行变量分配的堆中,经过多次分配与释放之后,堆中会有碎片,过不多久就必须扫描一次堆,把邻近的小的剩余空间合并为大的空间,以提高内存使用的效率。

   下面是使CFixedAlloc更便于使用的宏:
// DECLARE_FIXED_ALLOC -- used in class definition 
#define DECLARE_FIXED_ALLOC(class_name) \
public: \
void* operator new(size_t size) \
{ \
ASSERT(size == s_alloc.GetAllocSize()); \
UNUSED(size); \
return s_alloc.Alloc(); \
} \
void* operator new(size_t, void* p) \
{ return p; } \
void operator delete(void* p) { s_alloc.Free(p); } \
void* operator new(size_t size, LPCSTR, int) \
{ \
ASSERT(size == s_alloc.GetAllocSize()); \
UNUSED(size); \
return s_alloc.Alloc(); \
} \
protected: \
static CFixedAlloc s_alloc \

// IMPLEMENT_FIXED_ALLOC -- used in class implementation file
#define IMPLEMENT_FIXED_ALLOC(class_name, block_size) \
CFixedAlloc class_name::s_alloc(sizeof(class_name), block_size) \
   DECLARED_FIXED_ALLOC()宏担当了new与delete操作,这样,无需修改现有代码就可以应用CFixedAlloc;而IMPLEMENT_FIXED_ALLOC()则负责指定块大小。

如何使用CFixedAlloc
   1、把“fixalloc.h”包含在需要修改且含有类定义的头文件中。
   2、在类声明中添加DECLARE_FIXED_ALLOC()宏。
   3、在含有类定义的CPP文件中添加IMPLEMENT_FIXED_ALLOC()宏。
   4、重新编译。
   5、微调块的大小,以获得非常好的效果。

   因为CFixedAlloc是一个私有类,所以还要在编译器选项中添加一个额外的include目录,其必须指向MFC源代码目录。(因此,在安装Visual Studio时就要选择安装MFC源代码了,还好这通常情况下都是默认安装的。)

   大功告成,现在在自己的类中就可以使用MFC CFixedAlloc了,提醒一句:如果编译时代码中有#define _DEBUG,CFixedAlloc宏将不会展开,最终结果还是会和以前一样,就好像什么也没动过。

    对上面的第五步,还要补充一下,块的大小非常重要,如果太大,就会浪费内存;如果太小,则不会得到应有的性能提升,然而,即便这个值非常小,仍会减少对CRT分配函数的调用次数。块大小的理想值应恰好等于要分配的对象数,当然了,通常这是不可能的。

关于Visual C++ 2005的警告信息

    另外,不得不提一点,如果用Visual C++ 2005编译使用了CFixedAlloc的程序时,可能会遇到如下警告信息:

    .\CFixedAllocDemoDlg.cpp(237) : warning C4995:
    'CFixedAlloc': name was marked as #pragma deprecated
    .\CFixedAllocDemoDlg.cpp(240) : warning C4995:
    'CFixedAlloc': name was marked as #pragma deprecated

    这表明从Visual C++ 2005开始,微软已不赞成使用CFixedAlloc类,可我们一时也找不出什么可以代替它的方法,如果你觉得使用CFixedAlloc会让程序大有改观,大可以忽略这些信息,如果怕微软以后从MFC中移除CFixedAlloc类,带来程序上的兼容性问题,那建议你复制一份CFixedAlloc文件加以保存。
0
相关文章