할당자
할당자는 C++ 표준 라이브러리에서 컨테이너에 저장된 요소의 할당 및 할당 취소를 처리하는 데 사용됩니다. 형식 allocator<Type>
Type
의 템플릿 매개 변수를 제외한 std::array
모든 C++ 표준 라이브러리 컨테이너는 컨테이너 요소의 형식을 나타냅니다. 예를 들어 클래스는 vector
다음과 같이 선언됩니다.
template <
class Type,
class Allocator = allocator<Type>
>
class vector
C++ 표준 라이브러리에서는 할당자에 대한 기본 구현을 제공합니다. C++11 이상에서 기본 할당자는 더 작은 인터페이스를 표시하도록 업데이트되고 새 할당자를 최소 할당자라고 합니다. 특히 최소 할당자의 construct()
멤버는 성능을 크게 향상할 수 있는 이동 의미 체계를 지원합니다. 대부분 이 기본 할당자로 충분해야 합니다. C++ 11에서 할당자 형식 매개 변수를 사용하는 모든 표준 라이브러리 형식 및 함수는 std::function
, shared_ptr, allocate_shared()
및 basic_string
을 포함한 최소 할당자 인터페이스를 지원합니다. 기본 할당자에 대한 자세한 내용은 클래스를 참조 allocator
하세요.
고유한 할당자 작성(C++11)
기본 할당자는 new
및 delete
를 사용하여 메모리를 할당 및 할당 해제합니다. 공유 메모리를 사용하는 등의 다른 메모리 할당 방법을 사용하려면 고유한 할당자를 만들어야 합니다. C++11을 대상으로 지정하고 새 사용자 지정 할당자를 작성해야 할 경우 가능하면 최소 할당자로 설정하세요. 이전 스타일 할당자를 이미 구현했더라도 자동으로 제공되는 더 효율적인 construct()
메서드를 사용하기 위해 이전 스타일 할당자를 최소 할당자로 수정하는 것이 좋습니다.
최소 할당자를 사용하려면 상용구가 훨씬 적고 모든 작업을 수행하는 멤버 함수 및 deallocate
멤버 함수에 allocate
집중할 수 있습니다. 최소 할당자를 만들 때 아래 예제에 표시된 멤버를 제외한 멤버를 구현하지 마세요.
변환 복사 생성자(예제 참조)
operator==
operator!=
allocate
deallocate
제공되는 C++11 기본 construct()
멤버는 완벽한 전달을 수행하고 이동 의미 체계를 가능하게 하므로 이전 버전보다 대부분 경우에 훨씬 더 효율적입니다.
Warning
컴파일 시 C++ 표준 라이브러리는 클래스를 allocator_traits
사용하여 명시적으로 제공한 멤버를 검색하고 존재하지 않는 멤버에 대한 기본 구현을 제공합니다. 할당자에 대한 특수화를 allocator_traits
제공하여 이 메커니즘을 방해하지 마세요!
다음 예제에서는 malloc
및 free
를 사용하는 할당자의 최소 구현을 보여 줍니다. 배열 크기가 0보다 작거나 최대 허용 크기보다 클 경우 throw되는 새 예외 형식 std::bad_array_new_length
의 사용에 주의하세요.
#pragma once
#include <stdlib.h> //size_t, malloc, free
#include <new> // bad_alloc, bad_array_new_length
#include <memory>
template <class T>
struct Mallocator
{
typedef T value_type;
Mallocator() noexcept {} //default ctor not required by C++ Standard Library
// A converting copy constructor:
template<class U> Mallocator(const Mallocator<U>&) noexcept {}
template<class U> bool operator==(const Mallocator<U>&) const noexcept
{
return true;
}
template<class U> bool operator!=(const Mallocator<U>&) const noexcept
{
return false;
}
T* allocate(const size_t n) const;
void deallocate(T* const p, size_t) const noexcept;
};
template <class T>
T* Mallocator<T>::allocate(const size_t n) const
{
if (n == 0)
{
return nullptr;
}
if (n > static_cast<size_t>(-1) / sizeof(T))
{
throw std::bad_array_new_length();
}
void* const pv = malloc(n * sizeof(T));
if (!pv) { throw std::bad_alloc(); }
return static_cast<T*>(pv);
}
template<class T>
void Mallocator<T>::deallocate(T * const p, size_t) const noexcept
{
free(p);
}
고유한 할당자 작성(C++03)
C++ 03에서 C++ 표준 라이브러리 컨테이너와 함께 사용된 모든 할당자는 다음 형식 정의를 구현해야 합니다.
const_pointer
const_reference
difference_type
pointer
rebind
reference
size_type
value_type
또한 C++ 표준 라이브러리 컨테이너와 함께 사용된 모든 할당자는 다음 메서드를 구현해야 합니다.
생성자
복사 생성자
Destructor
address
allocate
construct
deallocate
destroy
max_size
operator!=
operator==
이러한 형식 정의 및 메서드에 대한 자세한 내용은 클래스를 참조 allocator
하세요.