2016-08-02 5 views
3

std::allocator을 사용하여 newdelete을 랩핑하는 사용자 지정 벡터를 작성한다고 가정 해 봅시다.realloc 대신 std :: allocator를 어떻게 사용합니까?

요소 수가 벡터의 용량을 초과하면 버퍼를 더 큰 것으로 재 할당하고 싶습니다. realloc()으로 전화하면 쉽게 해결할 수 있습니다. 할당 자/할당 취소의 책임은 할당 자에 있어야한다고 생각했기 때문에이 작업을 수행하고 싶지 않습니다.

그러나 std::allocator의 인터페이스를 보면 어떻게 재 할당 할 수 있는지 알지 못합니다. 다음 allocator::deallocate 대신 단지 reallocallocator::allocate를 호출

T* allocate(std::size_t n); 
void deallocate(T* p, std::size_t n); 

내가해야하며 :이 만 방법은? 그렇게 효율적입니까? std::vector도 마찬가지입니다. std::allocatorreallocate 기능을 제공하지 않는 이유는 무엇입니까?

+1

_ "왜 std :: allocator는 재 할당 기능을 제공하지 않습니까?"_이 내용은 [이 질문에 포함되어 있습니다] (http://stackoverflow.com/questions/3105001/why-is-there-no-reallocation -functional-in-c-allocators? rq = 1). – ArchbishopOfBanterbury

+0

[FYI] https://isocpp.org/wiki/faq/freestore-mgmt#realloc-and-renew – NathanOliver

+1

@NathanOliver "C++에서 재 할당을 처리하는 가장 좋은 방법은 표준 라이브러리 컨테이너를 사용하는 것입니다 , 벡터와 같은 자연스럽게 자라게하십시오. "이 질문의 출발점입니다 ... –

답변

4

std :: allocator를 사용하여 사용자 정의 벡터를 작성하여 새로 작성하고 삭제한다고 가정 해 보겠습니다.

일반적인 경우 (POD 전문화 제외) 나는 어떤 경우에도 realloc을 사용할 수 있다고 생각하지 않습니다. 특정 메모리 위치에서 생성 된 임의의 객체는 생성 된 주소와 관련하여 매우 특정한 주소를 가리키는 내부 포인터를 가질 수 있습니다. 간단히 (바이트 복사의 의미로) 그것을 움직이면 불변량이 깨질 수 있습니다.

따라서 대체해야 할 사항이 일반적으로 필요합니다. 새 배열 move (또는 심지어 copy!)을 새 위치에 할당 한 다음 이전 배열을 할당 해제해야합니다. 물론, 여기에는 실패 할 수있는 단일 단계 이상이 포함됩니다. 일반적인 경우에는 reallocate을 실제로 수행 할 수없는 또 다른 이유입니다. 배열 기반 컨테이너의 경우 일반적으로 POD 전문화에 사용할 수는 있지만 일반적으로이를 사용할 수는 없습니다.