Comment déplacer efficacement une classe avec un grand ensemble de membres de la pod? Exemple:
struct{ int a1; int a2; int a3; ... ... ... };
4 Réponses :
Les pods ne bougent pas, ils suffisent simplement. Parce qu'il n'y a pas d'indirection. Donc, utilisez simplement une affectation ordinaire et demandez au compilateur d'optimiser l'efficacité de votre efficacité. N'oubliez pas de mesurer systématiquement (quoi sur Terre vous faites différemment) et après. Considérez également si le temps de programmeur gaspillé, qui est de l'argent, vaut la micro-optimisation. P>
Lorsque vous dites "Demandez au compilateur d'optimiser l'efficacité" Que voulez-vous dire autre que d'utiliser en ligne code>?
@johnbakers Je crois, l'auteur signifiait "-O3" et tel.
Vous devez apporter un jugement d'ingénierie pour jouer. Imaginez pour un exemple que vous parlez de savoir s'il faut utiliser un Quand Lorsque Lorsque Votre travail, comme le concepteur, consiste à entrer dans cette zone grise entre ces deux extrêmes et prendre la bonne décision. Il n'y a pas de décision toujours juste. Les mesures de performance contre vos affaires d'utilisation attendues vont très loin. Utilisez std :: Array
std :: vecteur
n code> éléments, où
n code> est une constante de la compilation. p>
n code> est très petit,
std :: Array
n code> est très grand,
std :: vecteur
Vecteur code> avec le coût de la version seulement 3 mots, quelle que soit la taille de
n code>. p>
n == 3 code>, il ne fait aucun doute que c'est le meilleur choix. Quand
n == 3 000 000 code> Il ne fait aucun doute que c'est le meilleur choix. P>
Cette question trahissait un manque de compréhension de ce que le mouvement en C ++ 11 est pour. p>
Lorsque vous copiez un objet comportant des pointeurs ou possédant autrement des ressources, il existe deux façons de faire cette copie. Vous pouvez soit copier les références de pointeur / ressources, ou vous pouvez attribuer de nouveaux objets / ressources et copier la valeur des originaux dans les nouvelles. P>
Dans le premier cas, vous êtes laissé avec deux objets qui ont des références à l'objet même em>. QT fait-il beaucoup. Si vous utilisez un objet pour modifier quelque chose que vous référencez, vous modifiez également l'autre. Vous avez généralement besoin d'une sorte de compteur de référence afin de ne pas doubler - supprimer le pointeur ou à double libération de la ressource. p>
Dans le second cas, vous êtes laissé avec deux objets complètement séparés. Ceci est communément appelé "Semantitique de la valeur", car si vous copiez une pod en une autre, vous avez deux objets complètement séparés après. Changer on ne change pas un autre. P>
Déplacer la sémantique sont un mécanisme C ++ 11 pour permettre aux objets qui ont normalement une sémantique de valeur pour avoir une sémantique de référence dans certaines conditions. Il permet essentiellement un objet de voler em> les pointeurs / ressources référencés par une autre instance d'objet. P>
Par exemple, prenez Déplacer la sémantique est un moyen de transférer le tableau em> contenu dans un vecteur code> dans un autre. Après l'opération, l'objet Source de déplacement est "vide" (techniquement dans un état non défini, mais il est effectivement séparé des données qu'il attribuées). Le nouveau Comme vous pouvez le constater, tout est basé sur le concept d'un objet propriétaire de ressources. Les pods ne peuvent pas exprimer la propriété des pointeurs ou des ressources, car les pods doivent avoir des destructeurs triviaux (c'est-à-dire: destructeurs qui ne font rien). Parce que les pods ne peuvent pas exprimer la propriété, il n'y a rien à déplacer em>. Vous ne pouvez pas transférer la propriété entre les objets s'ils ne possèdent rien. P> std :: vecteur code>; Ceci est juste un wrapper autour d'un tableau alloué de manière dynamique et redimensionnée. Comme avec la plupart des objets de la bibliothèque standard C ++,
Vecteur CODE> implémente la sémantique de la valeur. Si vous copiez un
vecteur code>, le nouveau vecteur doit allouer un nouveau tableau et copier chaque élément de l'ancien dans le nouveau. Une fois que vous avez terminé, vous avez deux tableaux complètement séparés. P>
vecteur code> a maintenant le même pointeur que l'ancien
vecteur code> a fait; Le nouveau code> vecteur code> supprimera la mémoire qu'elle n'a pas alloué. p>
vecteur code> alloue et possède un tableau; C'est destructeurs la détruire. C'est comme ça que vous définissez la propriété. Le mouvement est sur transférer la propriété em>. P>
Faites une classe à pointer vers la classe avec des pods et utilisez STD :: Déplacer sur le premier. P>
Je ne pense pas que cela ne soit plus rapide qu'une simple affectation.
S'il vous est possible de stocker tous ces éléments dans un tableau, allouez de manière dynamique et volez le pointeur. Sinon, l'affectation est probablement votre meilleure mise.