2016-10-10 3 views
1

은 '당신이 std::vector 사용하려는 최적화 된 사용자 정의 할당 (예를 들어, 작은 할당에 대한 사용자 정의 할당이 std::string 같은 종류의 대신 힙의 스택에서 메모리를 가져옵니다 개발 된 가정 또는 Windows에서 예를 들어 VirtualAlloc을 사용하여 큰 용량의 메모리를 할당 한 다음 포인터를 증가시키는 청크 내부에서 단일 할당을 조각화합니다.반환 벡터

typedef std::vector<T, OptimizedAllocator<T>> OptimizedVector; 

함수에서 벡터를 반환하는 컨텍스트에서이를 사용하는 방법은 무엇입니까? 함수의 범위의 끝에서

OptimizedVector DoSomething() 
{ 
    OptimizedVector<int>::allocator_type alloc{}; 
    OptimizedVector<int> v{alloc}; 

    // Do stuff... 

    return v; 
} 

는 할당 객체는 파괴되기 때문에, 반환 된 벡터 오른쪽, 쓰레기를 포함 할 수있다?

대안은 추가 매개 변수로 각 기능에 대한 참조로 할당 된 개체를 전달할 수 있습니다,하지만

이 방법이 ... 안전하게 "삽입" 할당 자 객체 종류의 추한 벡터에?

이 문제를 어떻게 해결합니까? here 가입일

+0

할당 자 객체는 반환 값으로 복사되거나 이동됩니다. 위의 예제에서 반환 값은 이동으로 생성됩니다. 할당자는 복사 및 이동을 지원해야합니다. –

+0

참고 : 'std :: vector'에 대해 스택에서 안전하게 할당 할 수 없습니다. –

+0

@ Cheersandhth.-Alf 예 다음과 같이 할 수 있습니다. https://github.com/orlp/libop/blob/master/bits/memory.h#L45. – orlp

답변

0

:

컨테이너는 할당 및 요소 할당 해제 스토리지 및 구성하고 (그 allocator_traits로 지정된)들을 파괴하기 위해 사용된다 ALLOC의 내부 카피를 유지한다.

그래서 내가 잘못하지 않았다면, 당신이 무엇을 요구하고 있는지가 기본값입니다.

3

할당자가 예외없이 CopyConstructible이어야하고 이후 a1 == a2이 보유해야합니다 (동일한 메모리 풀을 공유 함을 의미). 나는 강력하게 this page on the Allocator concept을 읽는 것이 좋습니다.

std::vector은 할당 한 사본을 저장합니다.

따라서 안전하게 복사하도록 할당자를 구현하면 주어진 코드에 문제가 없습니다.

표준에 의해 정의 된 할당을 복사하여 보관
+0

할당자가 복사하려고 시도 할 때 메모리 덩어리를 보유하고 있으면 쉽게 문제가 될 수 있습니다. bad_alloc? – CashCow

+0

@CashCow 할당자는 할당간에 동일한 메모리 풀에 대한 참조를 공유하여이 문제를 해결해야합니다. 표준에서는이 동작이 필요합니다. – orlp

+0

예, OP가 자신의 OptimizedAllocator를 작성해야 이렇게 분명히 할 수 있습니다. 단점은 할당자를 쓰레드에 복사하면 둘 다 공유 메모리 리소스를 사용한다는 것이다. – CashCow

2

:

n4140 §23.2.1 [container.requirements.general 달리 명시되지 않는 한, 모든 컨테이너는이 절에 정의

/8 할당자를 사용하여 메모리를 얻었다 [...]이 할당의 사본은

vector

"는 달리 아니다 [...] 수행되는 메모리 할당에 사용 지정됨 ".

이렇게하면 할당자가 복사를 지원해야하며 실제 할당자가 상태가 필요한 경우 핸들이 될 수 있습니다.