std :: dynarray 대 std :: vector


84

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

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

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

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


1
"C ++ 14"는 언제부터 태그입니까? 나는 다른 일이하고 ... 존재하지 않는 것을 찾고 있었다
Kerrek SB

1
인가 std::valarray로 이름이 변경 std::dynarray? std::dynarray크기를 조정할 수없는 경우 어떤 점이 동적 입니까?
yasouser

9
@yasouser, 아니요, valarray. 배열의 길이는 런타임 값이 때문에의 역동적 인, 그것은 달리 컴파일 타임에 할 필요가 없습니다std::array
조나단 Wakely

21
지난주 C ++ 표준위원회 회의 dynarray에서 C ++ 14에서 제거되었으며 심각한 기술 문제가 있기 때문에 향후 기술 사양 (TR1의 새 버전이라고 생각)에 포함되었습니다.
Pete Becker

2
dynarray 는 더 이상 C ++ 14 초안의 일부가 아닙니다
cassinaj

답변:


90

그렇다면 더 동적 인 (크기 조정 가능)을 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에 없다는 것을 의미 합니다.


1
이 있다면 우수함, 궁금 해서요 어떤 아닌 사소한 구현 dynarray야생있다. 나는 항상 어떤 것이 표준화 대상이되기 전에 기존 관행의 두 가지 독립적 인 구현이 필요하다고 생각했습니다.
Kerrek SB

아니요, 스택 할당의 알려진 구현은 없습니다 dynarray. 구현 경험은 매우 유용하지만, 거기를 필요로 정해진 규칙이 없다 (그러나 일부는이 있어야 말할 것!)
조나단 Wakely

여기서 브레인 스토밍을했지만 std :: dynarray make_dyn_autostorage (int) 및 std :: dynarray make_dyn_heap (int)의 두 가지 함수를 만드는 것은 어떻습니까?
Laurijssen

2
@KerrekSB, 예, 시카고의 라이브러리 모션 10은 다음과 같습니다. "이동하여 계획된 Array Extensions TS에 대한 작업 문서를 만들고, N3639 두 문서에 의해 C ++ 14 CD에 적용된 편집 내용을 제거하십시오 ."자동으로 런타임 크기의 어레이 storage duration (revision 5) " N3662 ,"C ++ Dynamic Arrays (dynarray) "를 선택하고 Array Extensions TS 프로젝트 편집기가 해당 단어를 Array Extensions Working Paper에 초기 콘텐츠로 적용하도록 지시합니다."
Jonathan Wakely

3
@ h9uest는 "the C ++ guys"와 관련이 없습니다. 이들은 ISO 기술위원회 의 결과물에 대한 공식 이름입니다. iso.org/iso/home/standards_development/…iso.org/iso/home/standards_development를
조나단 Wakely

31

당신이 말했듯 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의 답변은 훨씬 더 권위 있고 통찰력이 있습니다.


dynarray의 생성자에 할당자를 전달하는 것은 할당에 사용되지 않으며 요소의 생성자에 대한 인수로만 사용됩니다 ( "uses-allocator 생성"사용). 이것이 할당자가 사용되었는지 여부를 쿼리 할 수없는 이유입니다.
Jonathan Wakely

@JonathanWakely : 아, 오해했습니다. 감사합니다.
Kerrek SB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.