tinyxml2中函数理解

来源:互联网 发布:淘宝开店卖家中心在哪 编辑:程序博客网 时间:2024/06/13 09:46
XMLElement* XMLDocument::NewElement( const char* name )
{
TIXMLASSERT( sizeof( XMLElement ) == _elementPool.ItemSize() );
XMLElement* ele = new (_elementPool.Alloc()) XMLElement( this );
ele->_memPool = &_elementPool;
ele->SetName( name );
return ele;

}

define TIXMLASSERT( x )           if ( !((void)0,(x))) { __debugbreak(); }

逗号表达式的关键是,整个表达式的值只取第二个表达式的值;

非void类型显式转换为void类型表达式,用于避免一些代码静态检查工具的警告(void)0,这里避免的警告就类似于if(1==1)这种

内存池

MemPoolT< sizeof(XMLElement) >_elementPool;
    MemPoolT< sizeof(XMLAttribute) > _attributePool;
    MemPoolT< sizeof(XMLText) > _textPool;
    MemPoolT< sizeof(XMLComment) > _commentPool;

定义了四个内存池,内存池用于分配大量大小相同的小对象的技术。通过该技术可以极大加快内存分配/释放过程。

内存池只涉及两个常量:MemBlockSize、ItemSize(小对象的大小,但不能小于指针的大小,在32位平台也就是不能小于4字节),以及两个指针变量MemBlockHeader、FreeNodeHeader。

内存块(MemBlock)和自由内存结点(FreeNode)。内存块大小一般固定为MemBlockSize字节(除去用以建立链表的指针外)。内存块在申请之初就被划分为多个内存结点(Node),每个Node大小为ItemSize(小对象的大小),计MemBlockSize/ItemSize个。这MemBlockSize/ItemSize个内存结点刚开始全部是自由的,他们被串成链表。
也就是:内存块<-内存结点->链表

内存申请过程分为两种情况:
在自由内存结点链表(FreeNodeList)非空。
在此情况下,Alloc过程只是从链表中摘下一个结点的过程。
否则,意味着需要一个新的内存块(MemBlock)。
这个过程需要将新申请的MemBlock切割成多个Node,并把它们串起来。
MemPool技术的开销主要在这

其中指针变量MemBlockHeader是把所有申请的内存块(MemBlock)串成一个链表,以便通过它可以释放所有申请的内存。FreeNodeHeader变量则是把所有自由内存结点(FreeNode)串成一个链。

0 0
原创粉丝点击