2011-08-19 3 views
4

J'essaie d'éviter d'avoir des pointeurs, et au lieu de faireÉvite pointeurs dans std :: liste

std::list<std::pair<int,int>* > myList; 
void addElement(int a, int b) { 
    myList.push_back(new std::pair<int,int>(a,b)); 
} 

je me suis dit que je pouvais faire quelque chose comme

std::list<std::pair<int,int> > myList; 
void addElement(int a, int b) { 
    std::pair<int,int> p(a,b); 
    myList.push_back(p); 
} 

Si je comprends bien le comportement, ce devrait stocker une copie de la paire, et l'effacer automatiquement en faisant myList.clear() (par opposition aux pointeurs).

Est-ce la meilleure façon de le faire? Puis-je attendre du compilateur qu'il optimise l'objet inutile p?

+4

Est-ce important si elle est optimisée ou non (le coût sera insignifiant). –

+6

Vous ajoutez un élément à une liste, ce qui provoquera une allocation de tas et entraînera de nombreux échecs de cache à chaque itération de la liste, et vous craignez de devoir en copier deux. –

+0

Je m'inquiète de gérer des pointeurs dans mon code et de provoquer des fuites de mémoire. J'ai demandé à avoir plus d'expérience sur la mise en œuvre pour m'assurer que je ne faisais rien d'exceptionnellement stupide. J'apprécie tous les commentaires et réponses. –

Répondre

8

Peut-être, peut-être pas. Essayez ceci cependant:

myList.push_back(std::make_pair(a,b)); 

Vous avez généralement de meilleures chances d'optimisation lorsque vous travaillez avec des valeurs r, le cas échéant. Mais même si ce n'est pas optimisé, ce n'est pas une raison pour utiliser des pointeurs, en particulier pour de si petits objets (pas que je recommanderais d'utiliser des pointeurs pour les objets volumineux). Utilisez uniquement des pointeurs quand ils sont sémantiquement la bonne chose à utiliser, et c'est rare.

5

En C++ 0x, vous pouvez utiliser std::list::emplace_back, qui utilise un transfert parfait pour transmettre des arguments au constructeur d'objet, créant ainsi le std::pair sur place. Mais sinon non; il va falloir créer un temporaire. "Puis-je attendre du compilateur qu'il optimise l'objet inutile p?"

1

Il est déraisonnable de s'attendre à ce que la copie soit optimisée. Peut-être, mais c'est un peu douteux. Le problème principal est qu'un argument d'une fonction doit être entièrement évalué avant l'appel de la fonction, alors que dans le cas d'une paire d'ints, cela pourrait bien fonctionner (il peut être inline, donc le compilateur peut voir il n'y a pas d'exception/effet secondaire), il est en général assez incommensurable. D'autre part, étant donné le coût élevé d'une allocation de mémoire dynamique, la copie est liée pour être moins cher dans ce cas particulier!