试图了解RapidXml内存分配

时间:2011-01-12 19:28:26

标签: c++ xml pointers return-value rapidxml

我在c ++程序中使用RapidXml。好吧没问题,它有效。我只是不明白为什么我必须使用指针而不是变量值... 如果您查看RapidXml wiki页面,会提供一些示例,这是RapidXml开发人员提供的示例:

#include <iostream>
#include <string>
#include "rapidxml-1.13/rapidxml.hpp"
#include "rapidxml-1.13/rapidxml_print.hpp"
int main(int argc, char** argv);
int main(int argc, char** argv) {
    using namespace rapidxml;
    xml_document<> doc;
    // xml declaration
    xml_node<>* decl = doc.allocate_node(node_declaration);
    decl->append_attribute(doc.allocate_attribute("version", "1.0"));
    decl->append_attribute(doc.allocate_attribute("encoding", "utf-8"));
    doc.append_node(decl);
    // root node
    xml_node<>* root = doc.allocate_node(node_element, "rootnode");
    root->append_attribute(doc.allocate_attribute("version", "1.0"));
    root->append_attribute(doc.allocate_attribute("type", "example"));
    doc.append_node(root);
    // child node
    xml_node<>* child = doc.allocate_node(node_element, "childnode");
    root->append_node(child);
    xml_node<>* child2 = doc.allocate_node(node_element, "childnode");
    root->append_node(child2);
    std::string xml_as_string;
    // watch for name collisions here, print() is a very common function name!
    print(std::back_inserter(xml_as_string), doc);
    std::cout << xml_as_string << std::endl;
    // xml_as_string now contains the XML in string form, indented
    // (in all its angle bracket glory)
    std::string xml_no_indent;
    // print_no_indenting is the only flag that print() knows about
    print(std::back_inserter(xml_no_indent), doc, print_no_indenting);
    // xml_no_indent now contains non-indented XML
    std::cout << xml_no_indent << std::endl;
}

那么,为什么它使用指向xml_node ???

的指针

我问这个因为我需要一个函数来返回一个xml_node ...

所以,如果我这样做:

xml_node&lt;&gt; * mynode = ... return * mynode;

好吗?因为我想稍后使用返回的节点及其所有子节点。 这样做好吗? 如果没有,我该怎么办?

3 个答案:

答案 0 :(得分:3)

可能需要返回指针以避免调用节点的复制构造函数。返回指针会更快,特别是考虑到节点可能已在内部分配。

他们本可以返回一个引用,但是他们可能希望保留在无效调用时返回NULL的能力。

如果需要xml_node,可以始终取消引用指针(首先检查NULL)。但是,如果你真的想稍后使用返回的节点及其子节点,那么最好只使用带有 - &gt;的返回指针。并按值传递指针。

答案 1 :(得分:2)

  

那么,为什么它使用指向xml_node的指针

可能是因为返回指向节点的指针要比返回时复制指针更快。

答案 2 :(得分:-2)

好吧......好吧,RapidXML和许多其他像Xerces一样,不会返回值而是指针,这样程序员就无法获取值并一直复制......这样做是为了保存内存... < / p>

特别是当关于DOM的谈话,以及SAX几乎相同时,这些解析器需要在运行程序的计算机RAM中创建一个非常复杂的内存分配结构。 为了提供性能等所有构造函数和COPY-CONSTRUCTORS都是私有的。

看一下图书馆......你会发现这个好玩法ahah。

原因是我报告的原因,并且每个人都建议我。

我想在使用c,c ++和低级语言时,编程方式不是那么直接...程序员不能接受节点并传递它或非常容易地返回函数和类。