cppreference의 선택 인용문 :
이 런타임 다형성을 통해 polymorphic_allocator를 사용하는 객체는 동일한 정적 할당 자 유형에도 불구하고 런타임에 다른 할당 자 유형을 사용한 것처럼 동작 할 수 있습니다.
"일반"할당 자의 문제는 컨테이너 유형을 변경한다는 것입니다. vector
특정 할당 자와 함께 하려는 경우 Allocator
템플릿 매개 변수를 사용할 수 있습니다 .
auto my_vector = std::vector<int,my_allocator>();
이제 문제는이 벡터가 할당자가 다른 벡터와 동일한 유형이 아니라는 것입니다. 예를 들어, 기본 할당 자 벡터가 필요한 함수에 전달하거나 다른 할당 자 유형을 가진 두 벡터를 동일한 변수 / 포인터에 할당 할 수 없습니다. 예 :
auto my_vector = std::vector<int,my_allocator>();
auto my_vector2 = std::vector<int,other_allocator>();
auto vec = my_vector; // ok
vec = my_vector2; // error
다형성 할당자는 템플릿 메커니즘을 통하지 않고 동적 디스패치를 통해 할당 자 동작을 정의 할 수있는 멤버가있는 단일 할당 자 유형입니다. 이를 통해 특정 사용자 정의 할당을 사용하지만 여전히 공통 유형 인 컨테이너를 가질 수 있습니다.
할당 자 동작의 사용자 정의는 할당 자에게 다음을 제공하여 수행됩니다 std::memory_resource *
.
// define allocation behaviour via a custom "memory_resource"
class my_memory_resource : public std::pmr::memory_resource { ... };
my_memory_resource mem_res;
auto my_vector = std::pmr::vector<int>(0, &mem_res);
// define a second memory resource
class other_memory_resource : public std::pmr::memory_resource { ... };
other_memory_resource mem_res_other;
auto my_other_vector = std::pmr::vector<int>(0, &mes_res_other);
auto vec = my_vector; // type is std::pmr::vector<int>
vec = my_other_vector; // this is ok -
// my_vector and my_other_vector have same type
내가보기에 남아있는 주요 문제는 std::pmr::
컨테이너가 여전히 std::
기본 할당자를 사용하는 동등한 컨테이너 와 호환되지 않는다는 것 입니다. 컨테이너와 함께 작동하는 인터페이스를 디자인 할 때 몇 가지 결정을 내려야합니다.
- 전달 된 컨테이너에 사용자 지정 할당이 필요할 수 있습니까?
- 그렇다면 템플릿 매개 변수를 추가해야합니까 (임의 할당자를 허용하기 위해) 아니면 다형성 할당 자의 사용을 의무화해야합니까?
템플릿 솔루션은 다형성 할당자를 포함한 모든 할당자를 허용 하지만 다른 단점이 있습니다 (생성 된 코드 크기, 컴파일 시간, 코드는 헤더 파일에 노출되어야하며 문제를 계속 외부로 밀어내는 "유형 오염"가능성이 있음). 반면에 다형성 할당 자 솔루션은 다형성 할당자를 사용해야 함을 나타냅니다 . 이것은 std::
기본 할당자를 사용하는 컨테이너를 사용하는 것을 배제 하고 레거시 코드와의 인터페이스에 영향을 미칠 수 있습니다.
일반 할당 자와 비교할 때 다형성 할당자는 memory_resource 포인터의 스토리지 오버 헤드 (무시할 가능성이 높음) 및 할당을위한 가상 함수 디스패치 비용과 같은 약간의 비용이 있습니다. 실제로 가장 큰 문제는 다형성 할당자를 사용하지 않는 레거시 코드와의 호환성이 부족하다는 것입니다.
allocator<T>
본질적으로 가지고있는 몇 가지 문제를 극복하려고합니다 . 따라서 할당자를 자주 사용하면 가치를 볼 수 있습니다.