Push_back과 Emplace_back: 심층 분석
소개
push_back과 emplace_back의 차이점 C에서의 연산은 종종 혼란의 원인이 됩니다. 두 함수 모두 컨테이너에 요소를 삽입하는 데 사용되지만 특히 rvalue 참조로 작업할 때 동작이 다릅니다.
Push_back 이해
push_back에는 세 가지 오버로드가 있습니다. 하나는 const 값을 취하고, 하나는 rvalue 참조를 취하고, 다른 하나는 가변 개수의 인수를 취합니다(C 11 이상). rvalue 참조의 맥락에서 push_back(Type&& _Val)은 예상대로 작동합니다. 즉, 복사본을 생성하지 않고 rvalue 참조를 컨테이너에 직접 삽입합니다.
Emplace_back의 출현
Microsoft Visual C(MSVC)는 rvalue 참조를 사용하는 중복된 것처럼 보이는 버전의 emplace_back을 도입했습니다. emplace_back(유형&&_Val). 이 오버로드는 rvalue 참조와 함께 사용될 때 push_back(Type&& _Val)과 기능적으로 동일하므로 중복됩니다.
Emplace_back의 진정한 힘
진짜 emplace_back의 잠재력은 가변 과부하(emplace_back(Args&&...))에 있습니다. push_back과 달리 이 오버로드를 사용하면 전달된 인수를 사용하여 컨테이너 내에서 개체를 직접 생성할 수 있습니다. 이렇게 하면 임시 객체를 생성할 필요성과 불필요한 복사 가능성이 제거됩니다.
Emplace_back 사용 시기
emplace_back은 임시 객체 생성에 상당한 비용이 소요되는 상황에서 특히 유용합니다. 간접비. 예를 들어 표준 맵에 복잡한 객체를 삽입하는 경우:
std::map<int, Complicated> m; int anInt = 4; double aDouble = 5.0; std::string aString = "C++"; // Avoids creating temporary objects m.emplace(4, anInt, aDouble, aString);
MSVC의 부분 구현
rvalue 참조에 대해 비표준 emplace_back 오버로드를 도입했음에도 불구하고 MSVC 아직 전체 가변 버전을 구현하지 않았습니다. 그 이유는 당시 Visual C 10에서 가변 템플릿 지원이 부족했기 때문입니다.
위 내용은 Push_back과 Emplace_back: 언제 C에서 각각을 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!