2009-07-10 7 views
2

Comment les gens gèrent-ils normalement la copie d'une liste d'objets volumineux?C++ Stocker de grandes données dans std :: list <> ..dois-je utiliser le comptage de références?

Voici ma situation:

Actuellement, j'ai ceci:

typedef std::vector<float> Image; 

et je stocker dans un

std::list<Image> lst; 

Le est assez grand Image.Size() (chaque est ~ 3-5 MB).

Je passe (copie) la liste autour.

Est-ce que je comprends bien que std :: vector copiera chaque élément par valeur? Si oui, la performance pourrait être un peu terrible en raison de la copie excessive? Que puis-je faire pour minimiser la copie?

Dois-je à la place de stocker

std::list<ImageRef> lst; 

typedef boost::shared_ptr<Image> ImageRef; 

?

Quelle est la manière élégante de traiter ce genre de problème?

+3

Je pense que vous avez répondu à votre propre question, en donnant une façon élégante et élégante de gérer le problème. La technique shared_ptr <> est presque certainement la voie à suivre. –

Répondre

5

Les objets plus grands que les types intégrés sont le plus souvent beaucoup moins chers à faire circuler par référence puis par valeur. Donc si votre objet mesure environ 3 Meg, et que vous devez le passer, ne le copiez pas!

Tous les types STL utilisent une sémantique de valeur: ils copient leur contenu. Notez que le contenu peut exister de pointeurs. Dans ce cas, les pointeurs sont copiés, pas ce à quoi ils se réfèrent.

Il peut même être une bonne idée de faire passer votre liste d'images par référence. Enregistre beaucoup de copie de pointeur intelligent, ce qui permet d'économiser beaucoup de gestion du nombre de références et d'économiser beaucoup de verrous/déverrouillages.

3

Je pense que la route boost::shared_ptr est une bonne approche, aussi longtemps que cela n'a pas d'importance que les Image ne soient pas copiés lorsque la liste est copiée. Vous minimiserez la copie, mais le comptage des références vous nettoiera également lorsque la dernière liste sera détruite.

1

Tout d'abord, je

typedef std::list<Image> ImageList; 

Si vous avez juste besoin de travailler avec une liste, la manipuler, passer des références à un ImageList lui-même. Pas besoin de copier quoi que ce soit de cette façon. Si vous devez conserver la liste originale et en faire des copies, boost :: shared_ptr est le chemin à parcourir.

2

Ne pas chercher à regarder dans le Boost pointer container. Copier boost :: shared_ptr est bon marché mais pas si bon marché. Le comptage de ref n'est pas gratuit non plus. Si vous faites beaucoup de copies et que vous n'avez pas besoin de partager un objet Image individuel, les conteneurs de pointeurs Boost sont la meilleure solution.

Questions connexes