2016-10-09 1 views
-1

Je lisais sur l'élision de la copie en C++. Et j'avais des doutes sur STL en C++ en utilisant cette élision de copie.élision de copie en utilisant STL (vecteur comme exemple)

Le code suivant:

#include <vector> 
#include <iostream> 
using namespace std; 

vector<int> merge(vector<int> &arrA, vector<int> &arrB) 
{ 
    int x; 
    vector<int> result; 

    for(x = 0; x < arrA.size(); x++) 
    { 
     result.push_back(arrA[x]); 
    } 
    for(x = 0; x < arrB.size(); x++) 
    { 
     result.push_back(arrB[x]); 
    } 
    cout << "fun return: " << &result <<endl; 
    return result; 
} 


int main(int argc, char const *argv[]) 
{ 
    vector<int> arrA; 
    arrA.push_back(1); 
    vector<int> arrB; 
    arrB.push_back(2); 
    vector<int> res; 

    res = merge(arrA, arrB); 
    cout << "return: " << &res <<endl; 

    return 0; 
} 

Je faisais une tâche simple (fusion) les vecteurs A et B (ne faites pas attention au processus, juste la fonction et le retour

vector<int> merge(vector<int> &arrA, vector<int> &arrB) 
.

la définition suivante, il renvoie une vector<int> (aucune référence)

Et aussi return result; qui est la variable déclarée dans la fonction sco pe. J'essayais de voir l'adresse mémoire à laquelle ces vecteurs sont situés. sortie:

==5036== Memcheck, a memory error detector 
==5036== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==5036== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info 
==5036== Command: ./a.out 
==5036== 
fun return: 0xffefffe40 
return: 0xffefffe20 
==5036== 
==5036== HEAP SUMMARY: 
==5036==  in use at exit: 0 bytes in 0 blocks 
==5036== total heap usage: 5 allocs, 5 frees, 28 bytes allocated 
==5036== 
==5036== All heap blocks were freed -- no leaks are possible 
==5036== 
==5036== For counts of detected and suppressed errors, rerun with: -v 
==5036== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

L'adresse mémoire est différente pour les deux si je pensais que tant qu'il ne sera faire une copie construtor, ce sera la même adresse mémoire à la fin (0xffefffe40) Est-ce que des moyens il est construit en copie?

Cette méthode est-elle en cours de copie?

  • sinon pourquoi ne pas copier élision?
  • si oui: Comment puis-je savoir qu'il est vraiment en train de faire l'élision de la copie?

Et l'important: si ce n'est pas en cours d'élision de copie, est-il possible de le faire? ce qui est nécessaire pour faire l'élision de la copie en STL?

+1

Cette question ne porte pas sur l'élision de la copie dans "STL" (quoi que ce soit à quoi il est fait référence), mais sur l'élision de la copie dans le code écrit par l'utilisateur. –

+2

Essayez 'vector res = fusionner (arrA, arrB);' à la place. –

+0

@SamVarshavchik merci !, donc selon cela. La copie-élision ne se produit que lorsque la suppression est dans la même ligne que la fonction appelant. Est-ce exact? – Miguel

Répondre

1

Pour la copie, vous devez d'abord avoir la "copie", c'est-à-dire que votre vecteur res doit être construit à partir de la valeur de retour.
Sinon, vous aurez juste une affectation, ce qui nécessite de se débarrasser de ce qui était dans le vecteur et ne peut donc pas être élidé.

Notez qu'il s'agirait toujours d'une affectation de déplacement, donc l'inconvénient ne sera pas si important (vous pouvez également le tester avec memcheck).