2011-07-28 3 views
11

새로운 C++ 11 표준은 STL 구현이 컨테이너에서 상태 저장 할당자를 지원해야합니다. 주요 STL 구현 (Visual Studio 2008, 2010, libstdC++)이 지금이 요구 사항을 준수합니까? 나는 이것에 대해 MSDN이나 libstdC++ 문서에서 아무 것도 발견하지 못했습니다.STL 컨테이너의 상태 저장 할당 자에 대한 컴파일러 지원

+0

이 답변 중 하나를 수락 하시겠습니까? – spraff

답변

14

널리 이미 지원 STL 컨테이너의 상태 할당 자의 기능처럼 보이는 특정 표준이 아닌 할당자를 supportes. 대부분의 경우 할당 자의 statefullness는 문제를 일으키지 않습니다. 널리 지원되지 않는 것은 새로운 표준이 문제 상황 (컨테이너의 스왑 (할당 자도 교환할지 여부), 목록의 스플 라이스)을 처리하는 방법입니다.

This thread는 말한다 :

, 상태 할당 자이 지원됩니다

This tread (된 libstdC++, 2004) (Dinkumware의 같은 MS에 의해 사용 포함) 최신 표준 라이브러리의 코드

말한다 (내가 이해하는 경우 올바르게) :

이미 할당자를 지원합니다 (l1.get_allocator() != l2.get_allocator()). 우리가하지 않는 것은 할당 자들을 탐지하기위한 특별한 규정을 splice()swap()에 두는 것입니다.

This blog entry (된 libstdC++, 2009)는 말한다 : C++ 0X 모드에서

기존 컨테이너 즉, 어떤 할당 자이 요소 건설시 즉석에서 만들어지지 않습니다 상태 할당 자 (과 함께 더욱 효율적이다).

This document 새로운 libc++ library에 대해 말한다 :

모든 용기는 완전히 상태 할당자를 지원하는 최신 할당 요구 사항 을 모두 충족. - 스테이트리스 (stateless) 할당자를위한 공간이 최적화되었습니다.

EASTL은 statefull 할당자를 지원합니다.

This thread에는이 휴대용 기능에 대한 흥미로운 분쟁이 있습니다.

대부분의 STL 구현은 statefull 할당자를 지원합니다. 즉, 후드 아래 할당 자 유형의 추가 인스턴스를 만들지 않지만 클라이언트 제공 할당 자 인스턴스를 저장하고이를 통해 모든 할당/할당 해제가 완료됩니다. 그러나 그들이 swap ping 및 list::splice을 처리하는 방법은 문서화되어 있지 않습니다.

업데이트 : VS2008의 STL은 할당 자에게 사용자 정의 할당 자의 가장 중요한 사용을 불가능하게 만드는 템플릿 복사 생성자를 사용할 것을 요구합니다. 단순 분리 저장.

STL에서 상태 저장 할당 자의 현재 상태에 만족하지 않는 사람이라면 Boost.IntrusiveBoost.Container을 고려하는 것이 좋습니다.

+0

사실 _all_ 표준 라이브러리는 할당자가 템플릿 복사 생성자와'rebind' 템플릿을 가지고 있고 그것을 사용해야합니다. 왜냐하면'vector'와'deque'를 제외한 모든 컨테이너는 요소가 구현 - 정의 된 구조체의 일부분을 할당하기 때문에 제공된 할당 자로부터 그 구조체에 대한 할당자를 생성해야하기 때문입니다. 이것은 할당 자 작성자가 단순히 고려해야 할 한 가지입니다. –