tinyxml2 源码分析(二)
主要分析XMLPrinter的实现和内存管理。
XMLPrinter的实现:
如果事先有大致浏览tinyxml2.h,就知道打印XML文档时使用了Visitor模式。所以看下面的分析至少要对Visitor模式有初步的认识。
先查看tinyxml2的文档,依照上篇博客的分析方法。跟踪函数的调用。
XMLPrinter printer;
doc.Print( &printer );
输出XML文档需要创建XMLPrinter对象,并将指针传递给XMLDocument::Print()函数
而Print()函数定义如下
void XMLDocument::Print( XMLPrinter* streamer ) const
{
XMLPrinter stdStreamer( stdout );
if ( !streamer ) {
streamer = &stdStreamer;
}
Accept( streamer );
}
从这里开始开始了Visitor模式。
这里的Accept()和常见的写法不太一样,额外增加了两个函数:VisitorEnter() VisitorExit(),由于此时的visitor指针实际上指向的是XMLPrinter,所以会调用子类的虚函数
bool XMLDocument::Accept( XMLVisitor* visitor ) const
{
TIXMLASSERT( visitor );
// 调用XMLPrinter::VisitEnter()
if ( visitor->VisitEnter( *this ) ) {
// ...
}
// 因为XMLPrinter并未重载VisitExit,所以调用XMLVisitor::VisitExit()
return visitor->VisitExit( *this );
}
而这个函数主要是通过PushHeader()来输出一个BOM头而已(这里就不展开了)
bool XMLPrinter::VisitEnter( const XMLDocument& doc )
{
_processEntities = doc.ProcessEntities();
if ( doc.HasBOM() ) {
PushHeader( true, false ); // 输出BOM头
}
return true;
}
再看XMLDocument::Accept()函数
if ( visitor->VisitEnter( *this ) ) {

本文深入分析了tinyxml2库中XMLPrinter的实现原理,揭示了其实现XML输出所采用的Visitor模式。同时,探讨了tinyxml2独特的内存管理方式,包括DynArray和MemPoolT类如何实现动态内存分配和内存池策略,以及它们如何优化效率并减少内存碎片。
587

被折叠的 条评论
为什么被折叠?



