할당자

할당자는 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)

기본 할당자는 newdelete를 사용하여 메모리를 할당 및 할당 해제합니다. 공유 메모리를 사용하는 등의 다른 메모리 할당 방법을 사용하려면 고유한 할당자를 만들어야 합니다. C++11을 대상으로 지정하고 새 사용자 지정 할당자를 작성해야 할 경우 가능하면 최소 할당자로 설정하세요. 이전 스타일 할당자를 이미 구현했더라도 자동으로 제공되는 더 효율적인 construct() 메서드를 사용하기 위해 이전 스타일 할당자를 최소 할당자로 수정하는 것이 좋습니다.

최소 할당자를 사용하려면 상용구가 훨씬 적고 모든 작업을 수행하는 멤버 함수 및 deallocate 멤버 함수에 allocate 집중할 수 있습니다. 최소 할당자를 만들 때 아래 예제에 표시된 멤버를 제외한 멤버를 구현하지 마세요.

  1. 변환 복사 생성자(예제 참조)

  2. operator==

  3. operator!=

  4. allocate

  5. deallocate

제공되는 C++11 기본 construct() 멤버는 완벽한 전달을 수행하고 이동 의미 체계를 가능하게 하므로 이전 버전보다 대부분 경우에 훨씬 더 효율적입니다.

Warning

컴파일 시 C++ 표준 라이브러리는 클래스를 allocator_traits 사용하여 명시적으로 제공한 멤버를 검색하고 존재하지 않는 멤버에 대한 기본 구현을 제공합니다. 할당자에 대한 특수화를 allocator_traits 제공하여 이 메커니즘을 방해하지 마세요!

다음 예제에서는 mallocfree를 사용하는 할당자의 최소 구현을 보여 줍니다. 배열 크기가 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 하세요.

참고 항목

C++ 표준 라이브러리 참조