2009-09-25 9 views
2

J'écris une application Qt qui doit gérer de grandes QImages. QImage utilise le partage implicite, ce qui signifie que la référence compte un pointeur de données interne. Chaque fois que le refcount est supérieur à 1, l'objet compte comme "partagé" et tout appel de modification de données, même potentiel, génère une copie en profondeur des données d'image.Qt4.5: QImage implicitement partagé: des méthodes telles que .bits() copient-elles toujours (documentation unclarity)

En bref: je ne veux pas que des copies en profondeur se produisent.

Je fais un certain nombre d'appels comme setPixel(), bits() etc. qui peuvent déclencher une copie. La documentation se lit parfois comme si certains appels seraient toujours déclencheur d'une copie complète (détachez appel), même si je fais de mon mieux pour garder le refcount à 1. Comme ici: QImage::setPixel()

Je veux savoir:

  1. Est-ce que le doc a formulé ces appels un peu gauchement et copient de manière fiable que partagé objets (comme dans refcount> 1)? Puis-je demander à un objet quel est le refcount actuel, pour des raisons de débogage et autres?
  2. Puis-je forcer Qt de ne pas partager implicitement des objets/des instances spécifiques (< - bien ici ma supposition est « non »)

Répondre

1
  1. opérations susceptibles de modifier l'instance partagée se détache. setPixel se détache. Essayez QImage :: isDetached() qui exécute un return d && d->ref == 1;. En utilisant un débogueur, vous pouvez accéder au refcount réel.
  2. Autre que de passer par référence/pointeur partagé pas.
+0

Damné. Ils n'ont même pas documenté ça ... Thx! Merci aussi de me rappeler que c'est de l'open source et que je dois juste y jeter un coup d'oeil! – AndreasT