2017-03-08 3 views
1

이 세 컨테이너는 모두 값 또는 전달 참조가 아닌 const 참조로 함수 객체를 허용합니다. 따라서 함수 객체를 컨테이너의 내부 저장소에 복사해야합니다 (최대 두 번).std :: map, std :: set 및 std :: priority_queue의 비교 연산자

함수 개체를 두 번 복사하는 이유가 있습니까? 사용자가 모든 유형의 함수 객체를 전달하고이를 내부 펑터 저장소에 구성 할 수있는 능력을 부여하는 것과는 반대의 개념입니까? 그렇게하면 도서관이 더 일반화되고 사용자에게 놀라움이 덜합니다.


동일한 철학 push_back() 함수에 적용된다 - 이것은 사용자에게 그들이 값 이동할 또는 복사 여부에 대한 더 많은 제어를 제공하기 때문에 그들이 두 과부하하는 CONST 참조 하나과 r- 수치의 참조를 가질 가치. 도서관은 유스 케이스에 대한 어떠한 가정도하지 않고 일반적인 경우에도 효율적이다.

이것이 C++ 이전 11 일 이후로 이월 된 디자인 결정이라고 생각됩니다. 이것이 표준에 대한 적절한 제안이 될까요?

답변

0

일반적으로 비교기는 복사가 매우 적은 아주 작은 개체로, 컨테이너를 한 번만 구성합니다. 한 번 더 복사하면 이 실제로이 될 수 있습니다. 대기 시간에 민감한 코드에 std::map 개의 묶음을 생성하지 않은 것 같습니다. 따라서 이러한 컨테이너에 대해 더 많은 생성자를 도입하면 많은 이점을 얻을 수 없습니다. 그리고 그러한 제안은 어떻게 생겼을까요? 또한 우 가치 참고로 Allocator을 가져 가고 싶습니까? 이제 더 많은 생성자를 추가합니다. Compare const&을 사용하는 모든 생성자를 변경하여 제한된 전달 참조를 대신 사용 하시겠습니까? 이제 우리는 ABI가 여전히 한계가 있다면 한계를 깨었다. 생성자는 복잡합니다. 나는 심지어 std::map이 오늘 디자인 되었다면 인터페이스가 이와 다르게 보일 것이라고 확신하지 못했습니다. 무엇이든간에 우리는 대신에 Compare을 값으로 사용합니다.

한편, push_back은 프로그램의 주요 런타임 중에 다양한 유형으로 많이 사용됩니다. vector으로 또는 emplace으로 vector으로 이동할 수 있다는 것은 엄청난 승리입니다. 두 가지 상황은 실제로 비교할 수 없습니다.

+0

왜 내부적으로 복사하는 경우에만 std :: thread 생성자가 rvalue 참조로 펑터를 수락합니까? 그리고 우리는 더 많은 생성자를 추가하지 않을 것입니다. 단지 전달 생성자에 의해 매개 변수를 받아들이도록 기존 생성자를 변경하는 것입니다. 그것들이 깨질 지 확신 할 수는 없지만 .. – Curious

+0

@Curious'thread'는 임의의 함수를 취하는 하나의 생성자를 가지고 있습니다. 'map'은 'Compare'또는 'Allocator'를 취하는 4 개의 생성자와 비슷합니다 - 모두를 변경해야합니다. 이것은 더 복잡하고 ABI를 깰 수 있습니다. – Barry

+0

정확히 ABI를 어기 는가? 비 rvalue를 전달하면 비교기는 이전과 같이 복사됩니다. – Curious

관련 문제