string str1("someString");
string str2 = string(str1);//how many copies are made here
//copy2 = copy1?
문자열에 문자열 (otherString)을 할당하면 괄호 안의 값을 복사 한 다음 해당 값을 변수에 복사합니까?몇 개의 std :: string 복사본이 만들어지고 있습니까?
string str1("someString");
string str2 = string(str1);//how many copies are made here
//copy2 = copy1?
문자열에 문자열 (otherString)을 할당하면 괄호 안의 값을 복사 한 다음 해당 값을 변수에 복사합니까?몇 개의 std :: string 복사본이 만들어지고 있습니까?
이론적으로는 컴파일러가 구현하는 언어의 버전에 따라 다르지만 실제로는 하나의 복사본이 있습니다.
string(str1)
은 str1
사본을 임시로 생성하려고합니다.
C++ 98/03에서 컴파일러는 이론적으로 복사 초기화를 사용하여 임시적으로 str2
을 초기화하므로 이론적으로 두 번째 복사본이 그 시점에서 만들어집니다. 실제로, 복사 작업 중 하나를 제거하지 않는 컴파일러를 찾는 것은 어려울 것입니다 (적어도 최적화가 가능하다면).
C++ 11에서 std::string
은 str2
을 초기화하는 데 사용되는 이동 생성자 (rvalue 참조를 사용하는 이동 생성자)가 있으므로 두 번째 복사본이 이론적으로는 발생하지 않아야합니다.
기술적으로 2 개의 사본이있을 수 있지만 실생활에서는 단지 1 개의 사본 만하고 있습니다. 즉, 컴파일러는 임시가 필요하지 않으며 사본을 최적화하는 것을 알게됩니다.