2011-01-12 5 views
0

私はRapidXmlをC++プログラムで使用しています。まあまあ問題ないそれは動作します。私が代わりに変数値のポインタを使用する必要がありますなぜ私はちょうどあなたがRapidXmlのwikiページに見てみる場合は、いくつかの例が提供され、これはRapidXml開発者によって提供される一つである... を理解していない: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 <> * MYNODE = ... リターン*のMYNODEを。

大丈夫ですか?返されたノードとそのすべての子を後で使用したいからです。 このようにするとよいですか? そうでない場合、どうすればよいですか?

答えて

3

ポインタを返すのは、ノードのコピーコンストラクタを呼び出さないようにするためです。特にノードが既に内部的にどこかに割り当てられていると考えると、ポインタを返す方が速いです。

また、参照を返した可能性もありますが、無効な呼び出しでNULLを返す機能を保持したいことがあります。

xml_nodeが必要な場合は、常にポインタを逆参照できます(最初にNULLを確認してください)。返されたノードとその子を後で実際に使用したい場合は、返されたポインタを - >で使い、値でポインタを渡すのが最善の方法でしょう。

2

それはリターン時にコピーを作成するよりも、ノードへのポインタを返すために高速ですので、まあ、なぜそれがおそらく

をxml_nodeするためにポインタを使用しません。

-2

OK ...よくラピッドXMLとXercesのような多くの人は、値を返すのではなくポインタを使用してプログラマが価値を持ち歩くことができないようにしています。これはメモリを節約するために行われています...

特にDOMについて話すときはSAXでもほとんど同じですが、これらのパーサーはプログラムが実行されるコンピュータのRAMに非常に複雑なメモリ割り当て構造を作成する必要があります。 パフォーマンスを提供するために、すべてのコンストラクターとコピー作成者はプライベートです。

ライブラリを見てみましょう...あなたはこの素晴らしいトリックを発見するでしょう。

私が報告した理由は誰もが私に示唆したものです。

私は、c、C++、および低レベルの言語を使用すると、プログラムする方法が直接的ではないと思います。プログラマはノードを受け取り、それを渡したり、関数やクラスに非常に簡単に戻ることはできません。

+3

-1あなた自身の質問に答えるのに2人の他の人がすでに答えてくれていますし、基本的には非常に長時間巻き込まれていて、まったくコヒーレントではないと繰り返しました。また、 "図書館を見て"と言います。誰かにあなたを助けてもらうように頼んだら、答えを盗んだ後、自分自身のためにそれを理解するように誰かに伝えるように伝えます。クールではありません。 –

関連する問題