Sto scrivendo un'app per entrambe le finestre di Linux & e ho notato che il build GCC sta producendo molte chiamate inutili al costruttore di copie.Contenitori di librerie standard che producono molte copie su rvalues in GCC
Ecco un codice di esempio per la produzione di questo comportamento:
struct A
{
A() { std::cout << "default" << std::endl; }
A(A&& rvalue) { std::cout << "move" << std::endl; }
A(const A& lvalue) { std::cout << "copy" << std::endl; }
A& operator =(A a) { std::cout << "assign" << std::endl; return *this; }
};
BOOST_AUTO_TEST_CASE(test_copy_semantics)
{
std::vector<A> vec_a(3);
}
Questo test crea solo un vettore di 3 elementi. Mi aspetto 3 chiamate di costruttore predefinite e 0 copie in quanto non ci sono valori l.
In Visual C++ 2010, l'uscita è:
default
move
default
move
default
move
In GCC 4.4.0 (MinGW), (-O2 -std = C++ 0x), l'uscita è:
default
copy
copy
copy
Cosa sta succedendo e come lo risolvo? Le copie sono costose per la classe attuale, la costruzione predefinita e le mosse sono economiche.
Hai visto l'intestazione ''? Cosa sta facendo il costruttore? Il comportamento GCC è coerente con la specifica C++ 03, in cui un oggetto viene costruito come predefinito, quindi copiato N volte. È possibile che la tua versione della libreria standard non supporti il nuovo costruttore aggiunto a C++ 0x, che in default costruisce N elementi. –
Poiché l'esempio utilizza le caratteristiche del linguaggio C++ 0x, suppongo che si tratti di una specifica sulle specifiche di C++ 0x, non sulle specifiche di C++ 03. –
Stesso output con GCC 4.5 – tstenner