Попытка понять распределение памяти RapidXml - PullRequest
0 голосов
/ 12 января 2011

Я использую RapidXml в программе на 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;
}

Ну, почему он использует указатель на xml_node ???

Я спрашиваю это, потому что мне нужна функция для возврата xml_node ...

Итак, если я сделаю это:

xml_node <> * mynode = ... возврат * mynode;

это нормально ?? Потому что я хочу использовать возвращенный узел и все его дочерние элементы позже. Это хорошо делать таким образом? Если нет, то как мне быть?

Ответы [ 3 ]

3 голосов
/ 12 января 2011

Возврат указателя, вероятно, сделан, чтобы избежать вызова конструктора копирования узла. Быстрее просто вернуть указатель, особенно учитывая, что узел, вероятно, уже где-то выделен внутри.

Они могли бы также вернуть ссылку, но они могли бы сохранить возможность возвращать NULL при недействительных вызовах.

Если вам нужен xml_node, вы всегда можете разыменовать указатель (сначала проверьте NULL). Если вы действительно хотите использовать возвращенный узел и его потомки позже, то, вероятно, лучше всего использовать возвращенный указатель с -> и передать указатель по значению.

2 голосов
/ 12 января 2011

Хорошо, почему он использует указатель на xml_node

вероятно, потому что быстрее вернуть указатель на узел, чем сделать копию при возврате.

0 голосов
/ 12 января 2011

ОК ... хорошо RapidXML и многие другие, такие как Xerces, не возвращают значения, а указывают, так что программист не может обойти это значение и делать копии полностью ... это делается для сохранения памяти ...

Особенно когда речь идет о DOM, но также и о SAX, это почти то же самое, эти парсеры должны создать очень сложную структуру выделения памяти в оперативной памяти компьютера, где запускается программа. Для обеспечения производительности и т. Д. ВСЕ КОНСТРУКТОРЫ и КОПИРОВАЛЬНЫЕ КОНСТРУКТОРЫ являются ЧАСТНЫМИ.

Взгляните на библиотеку ... вы обнаружите этот замечательный трюк, ахах.

Ну, вот причины, о которых я сообщил, и что все предложили мне.

Полагаю, что при использовании языков c, c ++ и языков низкого уровня программирование не так уж и быстро: программист не может взять узел и передать его или очень легко вернуться к функциям и классам.

...