Sto lavorando con un programma che utilizza molto lo std::vector
. Inoltre ci sono un sacco di allocazioni/deallocazioni in atto, miliardi di loro, e sto cercando di evitarne il maggior numero possibile. Dato che sono relativamente nuovo al C++, ho alcune domande riguardanti le allocazioni che si verificano quando si utilizza un vettore (ad esempio quando si aggiungono elementi ad esso). Sono su una macchina Win7 a 64 bit, il programma è a 32 bit e sto usando la versione corrente dei compilatori MinGW.Quando viene copiato un vettore, quando viene passato un riferimento?
Mi piacerebbe sapere, ciò che accade nei seguenti casi, vale a dire se il vettore viene copiato, passato come un punto di riferimento, ...
1.
std::vector<T> fillVector() {
std::vector<T> returnVector;
...
return returnVector;
}
std::vector<T> myVector = fillVector();
2.
std::vector<T>& fillVector() {
std::vector<T>* returnVector = new std::vector<T>;
...
return (*returnVector);
}
std::vector<T> myVector = fillVector();
3.
std::vector<T>* fillVector() {
std::vector<T>* returnVector = new std::vector<T>;
...
return returnVector;
}
std::vector<T>* myVector = fillVector();
e le seguenti, diverse operazioni:
4.
std::vector<T> myVector1;
... (myVector1 being filled)
std::vector<T> myVector = myVector1;
5.
std::vector<T>* myVector1 = new std::vector<T>;
... (myVector1 being filled)
std::vector<T> myVector = (*myVector1);
Supponendo che non voglio cambiare l'argomento in myFunction
/modifiche per myVector
in myFunction
wouldn non fa male al resto del programma:
6.
void myFunction(std::vector<T> myParam) {
...
}
std::vector<T> myVector;
... (myVector being filled)
myFunction(myVector);
7.
void myFunction(std::vector<T>& myParam) {
...
}
std::vector<T> myVector;
... (myVector being filled)
myFunction(myVector);
Se la mia comprensione è corretta, le opzioni più veloci (cioè i riferimenti di passaggio invece di creare copie e passarli) sarebbe 2/3, 5 e 7. Si prega di correggetemi se Mi sbaglio!
Il più veloce e più pulito è l'opzione 1. – juanchopanza