Estoy escribiendo una aplicación para las dos ventanas de linux &, y me di cuenta de que la compilación de GCC produce muchas llamadas inútiles al constructor de copias.Contenedores de biblioteca estándar que producen muchas copias en valores r en GCC
He aquí un ejemplo de código para producir este comportamiento:
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);
}
Esta prueba sólo crea un vector de 3 elementos. Espero 3 llamadas al constructor predeterminadas y 0 copias, ya que no hay A
lvalues.
En Visual C++ 2010, la salida es:
default
move
default
move
default
move
En GCC 4.4.0 (MinGW), (-O2 -std = C++ 0x), la salida es:
default
copy
copy
copy
¿Qué está pasando y cómo lo soluciono? Las copias son caras para la clase real, la construcción predeterminada y los movimientos son baratos.
¿Ha mirado el encabezado ''? ¿Qué está haciendo el constructor? El comportamiento de GCC es consistente con la especificación C++ 03, donde un objeto se construye por defecto y luego se copia N veces. Es posible que su versión de la biblioteca estándar no admita el nuevo constructor agregado a C++ 0x, que construye por defecto N elementos. –
Como el ejemplo usa las características del lenguaje C++ 0x, supongo que esta es una pregunta sobre la especificación C++ 0x, no sobre la especificación C++ 03. –
Mismo resultado con GCC 4.5 – tstenner