나는 리눅스 & 윈도우 모두에 대해 응용 프로그램을 작성 중이며 GCC 빌드가 복사 생성자에 쓸모없는 호출을 많이 생성하고 있음을 알 수 있습니다. 이 시험은 불과 3 개 요소의 벡터를 생성표준 라이브러리 컨테이너에서 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);
}
:
다음은이 동작을 생산하는 예제 코드입니다. 난 A
lvalues가 없기 때문에 3 개의 기본 생성자 호출과 0 개의 복사본을 기대합니다. 비주얼 C++ 2010
는 출력이다
은 GCC 4.4.0 (는 MinGW)에서default
move
default
move
default
move
(-O2 -std =는 C++ 0X), 출력은 :
default
copy
copy
copy
무슨 일이 벌어지고 있으며 어떻게 수정합니까? 사본은 실제 수업에 비쌉니다. 기본 건설과 이동은 저렴합니다.
''헤더를 보았습니까? 생성자는 무엇을하고 있습니까? GCC의 동작은 객체가 디폴트로 생성 된 후 N 번 복사되는 C++ 03 스펙과 일치합니다. 기본 라이브러리의 버전이 C++ 0x에 추가 된 새 생성자를 지원하지 않을 수도 있습니다.이 생성자는 기본적으로 N 개의 요소를 생성합니다. –
이 예제에서는 C++ 0x 언어 기능을 사용하기 때문에 C++ 0x 사양이 아니라 C++ 03 사양에 대한 질문이라고 가정합니다. –
GCC 4.5와 동일한 출력 – tstenner