2017-04-19 5 views
-4

이 push_back 오버로드가 어떻게 구현 되었습니까?어떻게 std :: vector :: push_back (T && 값)이 구현 되었습니까?

void push_back(T&& value); 

또는 구현 중 하나 일 가능성이 있습니까?

+2

컴퓨터의 라이브러리 헤더를 보면, 여기에 구현 된 내용을 붙여 넣을 때 어떤 것이 좋을지는 알 수 없습니다. –

+1

편도 :'data [last_element + 1] = std :: move (value);' – NathanOliver

+1

@JerryCoffin : nope -'value' 자체가 좌변 값입니다. 'value'를 rvalue reference로 만들기 위해서는'std :: move'가 필요합니다. –

답변

0

하나의 가능한 구현 : 존재하는 경우

template <typename T, typename Allocator> 
void 
vector<T, Allocator>::push_back(T&& _element) 
{ 
    if (size() == capacity()) reallocate(capacity() * 2); 

    construct(data()[size()], std::move(_element)); 
    ++size_val; 

    update_vector(); 
} 

구조는() T :: T (T & &)를 호출한다. 그렇지 않으면 T :: T (const T &)를 호출합니다.

매우 간단한 구현 될 것입니다 자세한 내용

0

A의 구성 https://en.cppreference.com를 참조 검색 :

template <typename T, typename Allocator> 
void vector<T, Allocator>::push_back(T&& _element) 
{ 
    emplace_back(std::move(_element)); 
} 

를 값 유형 T가 이런 식으로 일을, 이동 생성자 (즉, T::T(T&&)입니다)이있는 경우 복사 생성자를 사용하는 것보다 더 효율적일 수 있습니다. std::vector은 값 유형이 복사 생성 가능이어야하므로 이동 생성자가없는 경우 복사 생성자를 사용합니다.

이 경우 차이가 나는 일반적인 경우는 클래스에 대형 버퍼 또는 구조체에 대한 포인터가 포함되어있는 경우입니다. 우리가 수정할 수있는 동일한 데이터로 초기화 된 사본이 필요하고 원본이 유효해야하는 경우 값 비싼 사본을 만들어야합니다. 반면에, 소스가 일시적으로 버려 지려한다는 것을 알 때, 그 내용을 빈 오브젝트의 내용으로 바꿀 수 있습니다. 따라서 재 할당이나 내용의 깊은 복사본없이 동일한 메모리를 재사용 할 수 있습니다.