Je suis en train de réaliser l'optimisation suivante dans ma bibliothèque de conteneurs:élément conteneur inséré si possible
- lors de l'insertion d'un élément référencé lvalue, le copier dans la mémoire interne;
- mais lors de l'insertion de l'élément référencé rvalue, déplacez-le s'il est pris en charge.
L'optimisation est censée être utile, par ex. si le type d'élément contenu est quelque chose comme std::vector
, où le déplacement si possible donnerait une accélération substantielle.
Cependant, jusqu'à présent, je n'ai pas réussi à concevoir de plan de travail pour cela. Mon conteneur est assez compliqué, donc je ne peux pas simplement dupliquer le code insert()
plusieurs fois: il est grand. Je veux garder tout le "vrai" code dans une certaine aide interne, disons do_insert()
(peut être modélisé) et diverses fonctions-like insert()
appellent simplement cela avec des arguments différents.
Mon meilleur code pari pour ce (un prototype, bien sûr, sans rien faire réel):
#include <iostream>
#include <utility>
struct element
{
element() { };
element (element&&) { std::cerr << "moving\n"; }
};
struct container
{
void insert (const element& value)
{ do_insert (value); }
void insert (element&& value)
{ do_insert (std::move (value)); }
private:
template <typename Arg>
void do_insert (Arg arg)
{ element x (arg); }
};
int
main()
{
{
// Shouldn't move.
container c;
element x;
c.insert (x);
}
{
// Should move.
container c;
c.insert (element());
}
}
Cependant, cela ne fonctionne pas au moins avec GCC 4.4 et 4.5: il ne imprime pas « bouger "sur stderr. Ou est ce que je veux impossible à réaliser et c'est pourquoi les fonctions comme emplace()
existent en premier lieu?
Si je fais cela, je reçois deux "en mouvement" sur la sortie. Mais je suppose que j'ai besoin de lire de la documentation sur cette fonction. – doublep
Après avoir édité le code fonctionne et manque les arguments explicites étranges <> à 'do_insert()', contrairement à ma propre réponse. Merci! – doublep