2011-01-12 4 views
0

C++ 프로그램에서 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; 
} 

: 당신이 RapidXml 위키 페이지를 살펴 경우 내가 ... 변수 값 대신 를 포인터를 사용해야하는 이유 난 그냥 이해가 안 돼요, 제공되는 몇 가지 예는,이 RapidXml 개발자가 제공하는 하나입니다 왜 xml_node에 대한 포인터를 사용합니까? 나는 xml_node을 반환하는 함수에 필요하기 때문에

나는이 할 그렇다면 ...

을이 질문 = ... 반환 *의 MYNODE

xml_node에게 <> * MYNODE을;

괜찮습니까 ?? 왜냐하면 나중에 반환 된 노드와 모든 자식을 나중에 사용하려고하기 때문입니다. 이렇게하면 좋습니까? 그렇지 않으면 어떻게해야합니까?

답변

3

포인터를 반환하면 노드의 복사 생성자를 호출하지 않아도됩니다. 특히 노드가 이미 내부적으로 어딘가에 이미 할당되어있을 가능성이 높다는 점을 감안할 때 포인터를 반환하는 것이 더 빠릅니다.

또한 참조를 반환했을 수도 있지만 유효하지 않은 호출에서 NULL을 반환 할 수 있습니다.

xml_node가 필요한 경우 항상 포인터를 역 참조 할 수 있습니다 (먼저 NULL을 확인하십시오). 반환 된 노드와 그 자식을 나중에 사용하려는 경우에는 ->를 사용하여 반환 된 포인터를 사용하고 값으로 포인터를 전달하는 것이 가장 좋습니다.

2

글쎄, 왜 그것은 반환에 복사본을 만드는 것보다 노드에 대한 포인터를 반환하는 빠른 때문에 아마

을 xml_node에 대한 포인터를 사용 않습니다.

-2

OK ... 물론 RapidXML과 Xerces와 같은 많은 사람들은 값을 반환하지 않고 포인터를 사용하므로 프로그래머는 값을 가져 와서 복사본을 만들 수 없으며 메모리를 보존하기 위해 수행됩니다.

특히 DOM에 대해서 이야기 할 때 SAX에서도 거의 동일합니다.이 파서는 프로그램이 실행되는 컴퓨터의 RAM에 매우 복잡한 메모리 할당 구조를 만들어야합니다. 성능을 제공하기 위해 모든 작성자와 작성자는 사생활 보호를받습니다.

도서관을 살펴보세요.이 멋진 트릭을 발견하게 될 것입니다.

이유는 제가보고 한 것과 모두가 저에게 제안한 것입니다.

나는 C, C++ 및 저수준 언어를 사용할 때 프로그래머가 노드를 가져 와서 전달하거나 함수 및 클래스로 쉽게 복귀 할 수 없다고 생각합니다.

+3

-1 다른 두 사람이 이미 답변 한 후에도 자신의 질문에 대한 답변을 얻으려면 기본적으로 매우 오랫동안 말했듯이 일관성이없는 것으로 반복합니다. 또한 "도서관을 살펴보십시오"라고 말합니다. 다른 사람에게 도움을 요청한 다음 자신의 대답을 훔쳐 다른 사람에게 스스로 알아 내려고합니다. 쿨하지 않아. –

관련 문제