LINUX.ORG.RU

Являются ли QDomDocument и QDomElement классами с implicitly shared?

 ,


0

1

Читаю доку, вроде нашел список implicitly shared классов на странице Qt 5.4 - Qt Core - Implicit Sharing.

Классов QDomDocument и QDomElement в этом списке нет.

Значит, они не являются implicitly shared классами? Или об этом надо узнавать на основании каких-то других признаков?

★★★★★

Ответ на: комментарий от m0rph

И тот же вопрос для Qt4, у меня проект собирается и в Qt4 и в Qt5.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Мне-то зачем верить, ты в исходники посмотри. Видишь, там используется идиома PIMPL (класс QDomElement содержит только указатель на приватные данные)?
Посмотри реализацию QDomNodePrivate, увидишь, что он содержит атомарный счетчик ссылок. Теперь посмотри реализацию оператора присваивания QDomElement (в итоге ты придешь сюда). Типичный менеджмент количества ссылок с удалением приватной части при необходимости.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от m0rph

Судя по qdom.h в Qt 4.5, уже в нем был такой же механизм.

Убедил.

Но вот вопрос. У меня несколько классов, объекты последующего включены в объект текущего, грубо говоря:

- Корень
- Ветка
- Таблица записей в ветке
- Запись
- Таблица аттачей в записи
- Аттач

И вот у каждого такого класса есть метод exportDataToDom().

Методы эти вызываются по цепочке в глубину, и в конце концов формируется корневой QDomDocument.

Каждый метод принимает в параметре корневой объект QDomDocument, который нужен чтобы создать QDomElement. Если не знать корневого QDomDocument, то отдельно созданный QDomElement невозможно прилепить ни к QDomDocument, ни к QDomElement. Вот такая особенность DOM-модели в Qt.

Поэтому приходится тягать в глубины всех методов корневой QDomDocument. Я сейчас использую примерно такой код в методах exportDataToDom():

QDomElement Record::exportDataToDom(QDomDocument doc) const
{
  QDomElement elem=doc.createElement("record");

  ... 

  QDomElement att=attachTable.exportDataToDom(doc); // Проброс doc далее

  elem.appendChild( att );

  ...
}


Учитывая, что QDomDocument является Implicit Sharing объектом, то такой проброс должен приводить только к передачи указателя.

Но! Можно заметить, что в каждом методе exportDataToDom() есть команда вида:

doc.createElement("...");


Так вот я не пойму, эта команда меняет объект doc или нет? Если меняет, то у меня будут множиться эти QDomDocument как грибы после дождя.


То есть, я хочу узнать, может быть стоит передавать таки указатель на QDomDocument, вот так:

QDomElement Record::exportDataToDom(QDomDocument *doc) const
Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 3)
Ответ на: комментарий от Xintrea

Лучше передавать по указателю, т.к. даже если класс implicitly shared, все равно процессорное время будет расходоваться на возню со счетчиком ссылок, а т.к. это атомарные операции, то они более тяжелые, чем обычные. Кстати вот тут советуют тоже самое.

m0rph ★★★★★
()
Ответ на: комментарий от Xintrea

Переделал на передачу указателя на doc.

Зачем? Это ведь и так указатель, shallow copy же, explicitly shared. Не путать с implicitly shader, которого стоит справедливо бояться.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.