할당자는 대개 클라이언트 인 컨테이너 유형에 의존하지 않습니다. 순환 종속성이됩니다. 싸이클은 일종의 불완전한 클래스 인터페이스 또는 유형 삭제에 의해 해결되어야합니다.
불완전한 클래스 포인터 예를 들어
,이 경우
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(); };
이 풀도 컨테이너 유형을 알 필요가 없습니다.
하지만 두 경우 모두 특히 좋은 디자인 같지는 않습니다. 풀은 적어도 다른 컨테이너와 공유 할 수 없습니다.
이 필요성에 대한 목적을 좀더 명확하게 할 수 있습니까? 할당 자의 목록에 얼마나 많은 요소가 있는지 알기를 원한다는 것을 이해합니다. 할당 자의 할당 수 (할당 자 할당 해제 수)를 간단하게 계산하면됩니다. 그러나, 그것은 당신을 어떻게 도울까요? –
이 링크가 도움이되는지 확실하지 않은 경우 [사용자 지정 풀 할당 자의 성능 향상] (http://www.drdobbs.com/cpp/improving-performance-with-custom-pool-a/184406243) –
하나의 목록에서 다른 목록으로 노드를 연결합니까? – MSalters