2017-02-06 7 views
1

STL 컨테이너에 사용자 지정 할당자를 제공하는 옵션이 있습니다. 그러나 풀 공간이 부족하면 메모리 풀 블록 크기를 늘릴 수있는 구현을 찾을 수 없습니다. STL 할당자가 목록 컨테이너의 크기를 읽고 블록 크기를 자체 확장하는 방법은 무엇입니까?STL 목록의 요소 수를 기반으로 메모리를 할당하는 방법은 무엇입니까?

예를 들어, 블록 크기는 1, 2, 4 등으로 시작하고 컨테이너 내부에 1, 3, 7 노드가 있으면 다음 삽입이 발생한 직후 블록 크기가 커집니다.

+0

이 필요성에 대한 목적을 좀더 명확하게 할 수 있습니까? 할당 자의 목록에 얼마나 많은 요소가 있는지 알기를 원한다는 것을 이해합니다. 할당 자의 할당 수 (할당 자 할당 해제 수)를 간단하게 계산하면됩니다. 그러나, 그것은 당신을 어떻게 도울까요? –

+1

이 링크가 도움이되는지 확실하지 않은 경우 [사용자 지정 풀 할당 자의 성능 향상] (http://www.drdobbs.com/cpp/improving-performance-with-custom-pool-a/184406243) –

+0

하나의 목록에서 다른 목록으로 노드를 연결합니까? – MSalters

답변

1

표준 컨테이너는 제공된 할당 자 (멤버 함수 호출)를 사용하여 필요한 메모리를 할당합니다. 반대의 경우는 발생하지 않습니다. 표준에 지정된대로 할당 기 인터페이스에 어떤 컨테이너가 사용 중인지에 대한 정보를 제공 할 수있는 것도 없습니다. 즉, 표준에서 요구되는 것과 동일한 인터페이스를 가진 한 사용자 정의 할당자는 컨테이너 크기를 조사하는 수단이 없습니다.

원하는 것을 수행하려면 표준 할당 자와 다른 인터페이스를 가진 특수 목적 할당 자 및 해당 특수 목적 할당 자와 통신하는 방법을 알고있는 사용자 지정 컨테이너 (예 : std::list 대체)가 필요합니다. 사용자 정의 할당자를 표준 컨테이너 또는 표준 할당자를 사용하도록 사용자 정의 컨테이너에서 작동 시키려고하면 인터페이스가 호환되지 않을 수 있습니다.

또한 설명하는 동작 (매번 배가 할당)은 표준 라이브러리의 구현에 따라 다릅니다. 할당 전략은 다소 일반적이지만 표준에서 요구하지는 않습니다. 다른 구현은 허용되며 다른 구현은 다른 할당 전략을 사용합니다.

결국 컨테이너 크기의 상한을 계산/추정하고이를 사용하여 프로그램 실행에 필요한 메모리 양을 산출하고 최소한 그 양의 메모리를 설치하는 것이 더 쉬울 것입니다.

1

할당자는 대개 클라이언트 인 컨테이너 유형에 의존하지 않습니다. 순환 종속성이됩니다. 싸이클은 일종의 불완전한 클래스 인터페이스 또는 유형 삭제에 의해 해결되어야합니다.

불완전한 클래스 포인터 예를 들어

,이 경우

struct my_pool; 

template< typename t > 
struct my_allocator { 
    my_pool * pool; 
    // allocate, deallocate, etc. 
}; 

struct my_pool { 
    std::list< foo, my_allocator<foo> > const * client; 
}; 

std::list< foo, my_allocator<foo> > things; 
my_pool.client = & things; 

, std::list<…, my_allocator>my_allocator<std::__list_node>my_pool에 따라 달라집니다에 따라 다르지만 몇 가지 의존성은 포인터이기 때문에주기가 정상에 my_pool가 달려있다. std::function 유형의 삭제와 예를 들어

:

struct my_pool { 
    std::function< std::size_t() > client_size; 
}; 

std::list< foo, my_allocator<foo> > things; 
my_pool.client_size = [&]{ return things.size(); }; 

이 풀도 컨테이너 유형을 알 필요가 없습니다.

하지만 두 경우 모두 특히 좋은 디자인 같지는 않습니다. 풀은 적어도 다른 컨테이너와 공유 할 수 없습니다.

+0

이 문제는 할당 전략을 결정하는 컨테이너 (할당자가 얼마나 많은 메모리를 요청하는지)가 아니라 할당자를 결정한다는 점입니다. 할당자가 컨테이너가 요청한 것보다 적은 메모리를 할당하려는 경우 컨테이너는 요청한 메모리를 사용하려고 시도하지만 할당자가 제공하지 않은 경우 정의되지 않은 동작을 보입니다. – Peter

+0

@Peter 질문은 명확하지 않지만 할당 자 (allocator)가 특정 컨테이너의 크기를 기준으로 풀을 확장하는 방법을 결정한 것처럼 보입니다. 어쨌든, allocator의'allocate' 메쏘드가 필요에 따라 작동한다면, 모든 것이 정상이다. – Potatoswatter

+0

예 OP가 할당 전략을 결정하는 할당 자라고 OP가 잘못 가정했습니다. 그러나 할당 자'allocate() '가 요청한 것보다 다른 크기 (특히 더 작은 크기)를 리턴하면, 컨테이너는 그것을 나타내는 정보를받지 못합니다. 다시 말해, allocate()는 적어도 요청 된 양 또는 실패한 양 (예 : 표준 할당자가 throw)을 반환해야합니다. – Peter