태그 보관물: stdvector

stdvector

std :: dynarray 대 std :: vector 배열을 캡슐화하는 시퀀스 컨테이너입니다. std::dynarray와 동일하게 런타임에 할당되어야합니다

C ++ 14는 std::dynarray다음을 제공합니다 .

std :: dynarray는 구성시 고정되고 객체의 수명 동안 변경되지 않는 크기로 배열을 캡슐화하는 시퀀스 컨테이너입니다.

std::dynarray와 동일하게 런타임에 할당되어야합니다 std::vector.

그렇다면 더 동적 인 (또한 크기를 std::dynarray조정할 수있는) 사용할 수 있는 동안 의 이점과 사용법은 std::vector무엇입니까?



답변

그렇다면 더 동적 인 (크기 조정 가능)을 std::dynarray사용할 수있을 때 의 이점과 사용법은 std::vector무엇입니까?

dynarrayvector별도의 크기 및 용량 값을 관리 할 필요가없고 할당자를 저장할 필요가 없기 때문에 보다 작고 간단 합니다.

그러나 주요 성능 이점은 구현이 dynarray가능한 경우 스택 에 할당 하여 힙 할당을 피할 수 있다는 사실에서 비롯됩니다 . 예

std::dynarray<int> d(5);   // can use stack memory for elements
auto p = new std::dynarray<int>(6);  // must use heap memory for elements

이 최적화는 컴파일러의 협력을 필요로하며, 순수한 라이브러리 유형으로 구현할 수 없으며 필요한 컴파일러 마법이 구현되지 않았으며 그 작업이 얼마나 쉬운 지 아무도 모릅니다. 구현 경험이 부족하기 때문에 지난주 시카고에서 열린 C ++위원회 회의 std::dynarray에서 C ++ 14에서 가져 와서 별도의 배열 확장 TS (기술 사양) 문서 정의 std::experimental::dynarray및 런타임 바인딩 배열 (ARB, 유사 )을 발행 하기로 결정했습니다. C99 VLA에.) 이것은 std::dynarray거의 확실하게 C ++ 14에 없다는 것을 의미 합니다.


답변

당신이 말했듯 std::dynarray이, 고정 크기 동적 배열입니다. 크기를 조정할 수 없습니다. 대략적으로 계속해서 개선 new T[N]되고 std::unique_ptr<T[]>(new T[N])있습니다.

용량의 크기를 조정하거나 관리 할 필요가 없다는 것은 덜 복잡하고 적은 공간에서 데이터 구조를 구현할 수 있음을 의미합니다.

더욱이, std::dynarray구현이 다른 비 특정 방식으로 구현할 수있게 해주는 이상한 동물입니다. 예를 들어 스택에 배열을 배치 할 수 있습니다. 할당 함수 호출은 “선택 사항”입니다. 할당자를 지정하여 배열의 요소를 구성 할 수 있지만 이는 유형의 일부가 아닙니다.

우리가 왜 필요 당신은 또한 궁금 할 것이다 std::dynarray 가변 길이 배열. C ++ 14의 VLA는 훨씬 더 제한적입니다. 로컬 자동 변수 일 수 있으며 할당 정책을 지정할 수있는 방법을 제공하지 않으며 표준 컨테이너 인터페이스가 없습니다.


“현재 초안”23.3.4.2의 몇 가지 예 (Google 캐시) :

explicit dynarray(size_type c);

효과 :c 요소에 대한 저장 공간을 할당 합니다. global을 호출하거나 호출하지 않을 수 있습니다 operator new.

template <class Alloc>
dynarray(size_type c, const Alloc& alloc);

효과 : 각 요소가 uses-allocator 생성으로 생성된다는 점을 제외하면 앞의 생성자와 동일합니다 .

주어진 할당자를 사용하여 배열 요소를 구성 할 있는지 여부 는 전역 특성입니다.

템플릿 구조체 uses_allocator, Alloc> : true_type {};

요구 사항 : Alloc 할당 자 (17.6.3.5) 여야합니다. [ 참고 : 이 특성의 전문화 dynarray는 중첩 된 allocator_type이 없더라도 할당 자로 구성 할 수있는 다른 라이브러리 구성 요소를 알려줍니다 .]

편집 : Jonathan Wakely의 답변은 훨씬 더 권위 있고 통찰력이 있습니다.


답변