Si la vitesse de votre application est critique, je vous conseille d'utiliser l'opérateur [] car il crée au total 3 copies de l'objet original, dont 2 sont des objets temporaires qui seront tôt ou tard détruits.
Mais dans insert(), 4 copies de l'objet original sont créées, dont 3 sont des objets temporaires (pas nécessairement "temporaires") et sont détruites.
Ce qui signifie du temps supplémentaire pour : 1. L'allocation de la mémoire d'un objet 2. Un appel de constructeur supplémentaire 3. Un appel supplémentaire au destructeur 4. Une désallocation de la mémoire des objets
Si vos objets sont grands, que les constructeurs sont typiques et que les destructeurs libèrent beaucoup de ressources, les points ci-dessus comptent encore plus. En ce qui concerne la lisibilité, je pense que les deux sont assez justes.
La même question m'est venue à l'esprit, mais pas sur la lisibilité, mais sur la vitesse. Voici un exemple de code qui m'a permis de comprendre le point que j'ai mentionné.
class Sample
{
static int _noOfObjects;
int _objectNo;
public:
Sample() :
_objectNo( _noOfObjects++ )
{
std::cout<<"Inside default constructor of object "<<_objectNo<<std::endl;
}
Sample( const Sample& sample) :
_objectNo( _noOfObjects++ )
{
std::cout<<"Inside copy constructor of object "<<_objectNo<<std::endl;
}
~Sample()
{
std::cout<<"Destroying object "<<_objectNo<<std::endl;
}
};
int Sample::_noOfObjects = 0;
int main(int argc, char* argv[])
{
Sample sample;
std::map<int,Sample> map;
map.insert( std::make_pair<int,Sample>( 1, sample) );
//map[1] = sample;
return 0;
}
3 votes
Merci pour toutes les excellentes réponses - elles ont été très utiles. C'est une excellente démonstration de stack overflow à son meilleur. J'étais partagé quant à la réponse à retenir : netjeff est plus explicite sur les différences de comportement, Greg Rogers a mentionné les problèmes de performance. J'aurais aimé pouvoir cocher les deux.
6 votes
En fait, avec C++11, il est probablement préférable d'utiliser map::emplace ce qui évite la double construction
0 votes
@einpoklum : En fait, Scott Meyers suggère le contraire dans son exposé "The evolving search for effective C++".
0 votes
@ThomasEding : Lien ? De plus, IIANM, il ne devrait pas y avoir quelque chose de plus rapide qu'emplace, et une autre préférence serait probablement une question de style. Bien que je ne sois pas un expert en la matière.
3 votes
@einpoklum : C'est le cas lors de l'implantation dans une mémoire nouvellement construite. Mais en raison de certaines exigences de normes pour la carte, il y a des raisons techniques pour lesquelles l'emplacer peut être plus lent que l'insérer. L'exposé est disponible gratuitement sur youtube, comme ce lien youtube.com/watch?v=smqT9Io_bKo au bout de 38-40 minutes. Pour un lien vers l'OS, voici stackoverflow.com/questions/26446352/
1 votes
En fait, je contesterais une partie de ce que Meyers a présenté, mais cela dépasse le cadre de ce fil de commentaires et, quoi qu'il en soit, je suppose que je dois retirer mon commentaire précédent.