Stasera ho dato un'occhiata al codice su cui ho lavorato negli ultimi giorni e ho iniziato a leggere sulla semantica del movimento, in particolare std :: move. Ho alcune domande per chiederti ai professionisti di assicurarmi che sto seguendo la strada giusta e non facendo alcuna ipotesi stupida!Questo uso corretto della semantica 'sposta' C++?
In primo luogo:
1) In origine, il mio codice ha avuto una funzione che ha restituito una grande vettore:
template<class T> class MyObject
{
public:
std::vector<T> doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(theVector);
}; // eo doSomething
}; // eo class MyObject
Dato "theVector" è temporanea in questo e "usa e getta", mi modificata la funzione in:
std::vector<T>&& doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(static_cast<std::vector<T>&&>(theVector));
}; // eo doSomething
È corretto? Qualche insidia nel farlo in questo modo?
2) Ho notato in una funzione che restituisce std::string
che ha chiamato automaticamente il costruttore di spostamenti. Debugging in Return of the String (grazie, Aragorn), ho notato che chiamava un costruttore di move esplicito. Perché c'è uno per la classe stringa e non vettore?
non ho dovuto apportare modifiche a questa funzione per sfruttare la semantica move:
// below, no need for std::string&& return value?
std::string AnyConverter::toString(const boost::any& _val) const
{
string ret;
// convert here
return(ret); // No need for static_cast<std::string&&> ?
}; // eo toString
3) Infine, ho voluto fare alcuni test di performance, è il risultato incredibilmente-veloce Ho ottenuto std :: move semantics o il mio compilatore (VS2010) ha fatto anche qualche ottimizzazione?
(Attuazione _getMilliseconds()
omessi per brevità)
std::vector<int> v;
for(int a(0); a < 1000000; ++a)
v.push_back(a);
std::vector<int> x;
for(int a(0); a < 1000000; ++a)
x.push_back(a);
int s1 = _getMilliseconds();
std::vector<int> v2 = v;
int s2 = _getMilliseconds();
std::vector<int> v3 = std::move(x);
int s3 = _getMilliseconds();
int result1 = s2 - s1;
int result2 = s3 - s2;
I risultati sono stati, ovviamente, eccezionale. result1, un compito standard, ha richiesto 630ms. Il secondo risultato, era 0ms. E 'un buon test delle prestazioni di queste cose?
So che alcuni di questi sono ovvi per molti di voi, ma voglio essere sicuro di capire la semantica giusto prima di andare sul blazer del mio codice.
Grazie in anticipo!
Perché stai utilizzando 'static_cast' invece di 'std :: move'? –
GManNickG
@GMan - Ecco perché sto facendo queste domande. La mia motivazione originariamente proveniva da qui: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm#string Motivazione che potrei aver letto male, quindi questo post :) –
Ho aggiunto un link alla mia risposta per voi da leggere se volete veramente imparare i rvalues. – GManNickG