Я пишу приложение как для Linux, так и для Windows, и заметил, что сборка GCC создает множество бесполезных вызовов для конструктора копирования.
Вот пример кода для создания такого поведения:
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 );
}
Этот тест просто создает вектор из трех элементов. Я ожидаю 3 вызова конструктора по умолчанию и 0 копий, поскольку нет A
lvalues.
В Visual С++ 2010 вывод:
default
move
default
move
default
move
В GCC 4.4.0 (MinGW), (-O2 -std = С++ 0x), вывод:
default
copy
copy
copy
Что происходит и как я могу это исправить? Копии дороги для фактического класса, по умолчанию конструкция и ходы дешевы.