tinyxml2 源码分析(二)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 ) ) {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值