2010-12-10 2 views
0

적은 수의 요소에 로컬 버퍼를 사용하는 컨테이너가 있으며 요소 수가 특정 한도를 초과하는 경우에만 힙 할당을 사용합니까? 대부분의 std::string 구현과 유사합니다.스택 및 동적 할당이있는 컨테이너


배경 컨테이너는 다음 간체 문맥에서 사용

:

Foo foo;      // some data 
vector<HandlerPtr> tagged; // receives "tagged" items 

// first pass: over all items in someList 
for each(HandlerPtr h in someList) 
{ 
    h->HandleFoo(foo);   // foo may become tagged or untagged here 
    if (foo.Tagged()) 
    tagged.push_back(h); 
} 
for(auto itr=tagged.rbegin(); itr!=tagged.end(); ++itr) 
{ 
    // ... 
} 

이 코드 부분을 갖는다 고 호출 주파수하지만 항목 태그 것은 오히려 드문 번호 someContainer의 항목은 일반적으로 낮지 만 바인딩되지 않습니다. 미리 할당 된 "보다 글로벌 한"버퍼를 쉽게 사용할 수 없습니다. 목표는 빈번한 할당을 피하는 것입니다.


전화 주파수

  • 공통 : 어떤 항목이 태그가 없습니다된다. std :: vector is fine
  • 공통 : 몇 가지 항목 중 하나만 태그가 지정됩니다. 높은 주파수 할당 내가
  • 매우 드문 피하려고하지만, 지원되어야 발생합니다 someList는 첫 번째 패스 동안 항목의 수를 예측하지만 여전히 부족하지 성장
+0

정적 또는 스택 할당을 사용 하시겠습니까? 스택 할당에 대한 자세한 내용은 http://stackoverflow.com/questions/354442/looking-for-c-stl-like-vector-class-but-using-stack-storage – nimrodm

+0

@nimrodn을 참조하십시오. 나는 (고정 된 제목) 싶다. 즉 컨테이너 인스턴스 내에 저장 될 수있는 제한된 수의 요소 (추가 할당없이), 그리고 충분하지 않은 경우 힙 할당을 사용합니다. – peterchen

+0

적어도 하나의 요소가 삽입되기 전에'std :: vector'는 메모리를 할당하지 않습니다. –

답변

3

행동 이런 종류의 보장 표준 컨테이너가 없다 . 그러나 작은 스택 할당을 위해 작은 스택 버퍼에서 가져온 사용자 지정 STL 호환 할당 자 클래스를 만들 수 있으며 요청 된 할당 크기가 스택 버퍼의 크기를 초과하는 경우에만 힙 할당을 수행합니다. 사용자 지정 할당 자 클래스를 std::vector<T, Alloc>의 두 번째 템플릿 매개 변수로 플러그인 할 수 있습니다.

맞춤 할당기를 만드는 방법에 대해서는 this article을 읽어야합니다.

+3

벡터의 공간은 거의 작지만 "충분하다"는 시도를 할 수도 있습니다. 벡터의 정책이 크기 1에서 시작하고 현재 크기에 관계없이 동일한 크기 조정 정책을 사용하면 재 할당을 잠재적으로 피할 수 있습니다. –

+1

@ Karl : 일반적인 시나리오는 컨테이너가 비어있는 상태로 유지된다는 것입니다. 항상 동적 메모리를 할당하기 때문에 예약은 나쁜 것입니다. – visitor

+1

C++ 0x에서 확실히 해결책입니다. 그러나 C++ 03 Allocators가 Allocators의 모든 인스턴스간에 공유되지 않는 상태를 유지하면 안됩니다 (즉, 같은 유형의 다른 할당자가 요청 될 수 있음). 두 인스턴스가 완전히 관련이없는 경우에도 삭제/할당 취소). 실제로, 나는 그것이 작동해야한다고 생각한다 : –

0

이 보장되지 않지만, 대부분의 std::string 그냥 내가 본 vectors 그것을 할, 그리고하지 않은

(VC++ 10 최대 8 또는 16 문자 thusly 히 저장된 포함) 인 Small String Optimization를 구현한다 항상 이유가 궁금했지만 C++ 표준에서는 std::aligned_storagealignof을 사용하여이를 용이하게합니다. 이렇게하면 기본 메모리가 올바르게 정렬되고 기본 스택 메모리가있는 컨테이너를 작성할 수 있습니다.

+0

벡터의 크기는 일반적으로 세 포인터의 size보다 크지 않다. 얼마나 많은 데이터가이 공간에 들어 맞을 것인가? 하우스 키핑 데이터를 저장해야하는 경우? – visitor

+1

@visitor : 포인터의 상위 비트를 사용하여 데이터를 유지하는 경우에 따라 달라집니다. :) 그러나 개인적으로 buffy 'vector'클래스를 기꺼이 보유하게됩니다. 'vector'를 복사하는 데 드는 비용은 동적 인 할당 (따라서'allocate'에 대한 호출)과 기존 데이터의 딥 카피를 포함하기 때문에 3 개의 포인터를 복사하는 비용과 많이 다릅니다. 따라서 필자의 생각은 단순히 여분의 공간을 확보하는 것이 더 저렴할 것이라는 것이었다. 예 : '벡터 '. 그러나 나는 그런 용기가 없다는 것을 안다. 그러나 STL의 효율을 맞추기는 항상 어렵지만 나는 집에서 그것을 시도 할 것이다. –

+0

@Mattieu : * 일치하기가 어렵습니다. * - 정확하게는 특히 효율성 + 유연성 조합입니다. 내 특별한 경우를 위해 무언가를 채우는 것은 쉽지만, 너무 많은 제한이있어서 우습지 않을 것입니다. – peterchen