AllocatorAware 컨테이너를 올바르게 작성하는 방법을 이해하려고합니다.propagate_on_container_move_assignment의 사용 예
제 생각에 propagate_on_container_move_assignment
typedef는 컨테이너 자체가 이동 할당 될 때 특정 Allocator
유형을 복사해야하는지 여부를 나타냅니다. 나는이의 예를 찾을 수 없기 때문에
그래서, 그것에 내 자신의 자상은 다음과 같을 것이다
감안할 때 컨테이너 유형 Container
, Allocator
유형 allocator_type
및 내부 allocator_type
데이터 멤버 m_alloc
:
Container& operator = (Container&& other)
{
if (std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value)
{
m_alloc = std::allocator_traits<allocator_type>::select_on_container_copy_construction(
other.m_alloc
);
}
return *this;
}
이 정보가 맞습니까?
또 다른 혼란의 원인은 중첩 된 typedef propagate_on_container_move/copy_assignment
이 구체적으로 지정에 대해 이야기하고 있다는 것입니다.하지만 생성자는 어떻습니까? AllocatorAware
컨테이너의 이동 생성자 또는 복사 생성자도 이 typedef를 확인해야합니까? 나는 대답은 여기 예 것 생각 ... 의미는, 나는 또한 작성해야 할 것 : 나는 libc++의 <vector>
헤더를 공부하는 것이 좋습니다
Container(Container&& other)
{
if (std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value)
{
m_alloc = std::allocator_traits<allocator_type>::select_on_container_copy_construction(
other.m_alloc
);
}
}
'propagate_on_move_assignment'가 참이지만 lhs와 rhs의 할당자는 같지 않은 경우는 어떻게됩니까? 만일'propagate_on_move_assignment'가 참이라면 먼저 allocators가 equal을 비교 하는지를 검사해서는 안되며 만약 equal되어 있다면 할당자를 이동 할당하기 전에 모든 메모리의 할당을 해제 할 필요가 없습니다. (이 방법으로 이미 할당 된 메모리를 다시 사용할 수 있습니다) – Siler
rhs에서 lhs까지 모든 메모리의 소유권을 이전 할 수있는 컨테이너 디자인이라면 lhs의 메모리를 다시 사용할 필요가 없습니다. 그러나 모든 메모리를 전송할 수 없으면 rhs가 제공 할 수없는 경우와 할당자가 동일한 경우 lhs의 메모리를 다시 사용하면 편리합니다. 나의 편견은 컨테이너 디자인이 메모리의 100 %가 전송 될 수있을 때 가장 좋으며, rhs는 리소스가없는 상태로 남겨 둡니다. –