2017-10-20 1 views
0

나는 C++ 11 std :: allocator 요구 사항을 실행하고 작동하는 실행을 위해 작성한 풀 할당자를 가지고 있지만 사용 된 정책은 (다음 용지 기준)를 기준으로 :특정 STL 컨테이너에 고정 크기 청크 풀 할당 자 적용하기

https://pdfs.semanticscholar.org/4321/a91d635d023ab25a743c698be219edcdb1a3.pdf

은 정말 우수한 동시에 그것을위한 충분한 크기의 메모리 블록으로 하나의 단일 객체를 할당한다.

std :: allocator 템플릿 메서드 "allocate"에는 STL 컨테이너가 동시에 할당 할 블록 수를 요청할 수있는 매개 변수가 있습니다. 예를 들어, std :: basic_string처럼 보입니다. 일단 스택에 남아있는 특정 크기의 문자열을 초과하면 할당 자의 연속적인 메모리 블록을 요청하여 char 배열을 저장할만큼 힙으로 전체를 한 번에 이동합니다 전체 문자열을 들고. std :: vector의 동적 확장이 비슷한 방식으로 작동하는 것 같습니다.

이 유형의 STL 컨테이너에 템플릿 화 된 유형의 크기를 고정 크기 청크를 반환하도록 설계된 할당기에 적용 할 수있는 방법이 있습니까?

+2

표준 할당 기가 템플리트가 지정된 유형의 항목 수에 대해 연속 저장 영역을 할당 할 수 있어야합니다. –

+1

(옵션) 멤버 인'size_type max_size()'를 제공 할 수 있으며, 위반했을 때 throw합니다. – Caleth

답변

1

당신은이 경로 아래로 갈 수 :

On the other hand, multiple instances of numerous fixed-sized 
pools can be used to produce a general overall flexible 
general solution to work in place of the current system 
memory manager. 

을 그리고 실제로 * 카운트를 반대하는 새 풀에 대한 요청, 즉 당신의 "개체의 크기"등의 각기 다른 크기의 요청을 처리합니다. 많은 RAM을 구울 수 있습니다. 배열 크기의 상한값을 넣을 수 있으며 그 위에 기본 일반 할당으로 폴백 할 수 있습니다.

+0

구현자가 할당자를 할당 할 수있을 정도로 일반화 된 것 같습니다. 즉 N 메모리 풀의 메모리 풀을 만듭니다 그 자신은 std :: basic_string과 같은 문자 배열을 저장할만큼 큰 연속적인 저장 블록을 할당합니다. 불행히도 std :: basic_string은 allocator가 char 타입의 배열을 가리키는 포인터가 아니라 문자 타입으로 템플릿을 만들 것을 기대하므로 구현을 수정하여 블록 크기가 연속적인 저장 공간을 반환 할 정도로 충분히 커야합니다. 기본 유형을 템플릿으로 작성한 경우 – Bitrex

+1

할당 함수에 두 번째 매개 변수를 추가합니다 (단위 수). –

관련 문제