Quand est-ce qu'une copie profonde arrive à une QList?

dans une classe sur laquelle je travaille, je jongle avec plusieurs QList s. J'ai entendu dire que Qt essaie de ne pas faire de copies approfondies des listes chaque fois que c'est possible. D'après ce que j'ai compris, cela signifie qu'aucune copie profonde ne se produit lorsque vous faites ceci:

QList<int> myList;
myList << 1 << 2 << 3 << 4;
QList<int> otherList = myList;  // No deep copy

dans certains cas, je dois m'assurer qu'une copie profonde n'arrive jamais au QList . Exactement ce genre d'opération ou de l'action dois-je veiller à éviter afin de s'assurer qu'une copie en profondeur n'arrive jamais à un QList je travaille avec?

11
demandé sur Cory Klein 2011-07-29 01:48:53

3 réponses

les listes QL sont mises en œuvre en utilisant partage implicite .

affectation des Objets (avec l'opérateur=()) pour implicitement partagé des objets est implémenté en utilisant des copies superficielles.

cela signifie que la seule assignation ne provoquera jamais la copie des données contenues. Cependant, en écrivant à une instance partagée , fera que l'objet source sera copié. Ce modèle est communément connu comme copy-on-write.

donc, pour répondre à votre question, si vous n'écrivez jamais dans des instances partagées, elles ne seront jamais copiées. Si vous voulez empêcher complètement les copies d'être faites, puis dérivez de QList et outrepassez et cachez le constructeur de copies et l'opérateur de tâche.

13
répondu Stu Mackellar 2015-07-14 15:41:38

quand vous passez une QList comme argument d'une fonction ou quand vous créez des copies sans la modifier Qt passe juste un "wrapper", les données réelles ne sont jamais copiées le long. Le partage implicite est la mise en œuvre Qt du modèle Flyweight, voir ici .

2
répondu Humberto Pinheiro 2011-07-29 01:15:31

il suffit de s'assurer d'utiliser constBegin() , constEnd() , passer par const référence, ne pas modifier ou copier.

1
répondu user1095108 2015-07-14 15:45:16