연속 메모리가있는 C ++ 벡터에 해당하는 C #?


85

C ++ 벡터에 해당하는 C #은 무엇입니까?

이 기능을 찾고 있습니다.

표준 배열에 비해 액세스 성능 저하가없는 연속적으로 저장된 메모리의 동적 배열을 갖기 위해.

나는 찾고 있었고 그들은 이렇게 말합니다 .NET equivalent to the vector in C++ is the ArrayList.

ArrayList에 연속 메모리 기능이 있습니까?


4
구조가 메모리에 할당되는 방식을 지정 (또는 일관되게 예상)하기에 CLR이 금속에 불충분하게 가깝지 않습니까?
— Aphex

답변:


101

당신은을 사용할 수 있습니다 List<T>때 T경우 경우가 아닐 것은 연속적인 메모리에 할당 될 값 타입 T참조 타입이다.

예:

List<int> integers = new List<int>();
integers.Add(1);
integers.Add(4);
integers.Add(7);

int someElement = integers[1];

2
@cMinor, List<T>클래스 문서 에는 많은 예제가 포함되어 있지만 대답을 업데이트하여 하나를 포함했습니다.
— Darin Dimitrov

5
나는 CLR에 100 % 익숙하지 않지만 T참조 유형 이더라도 연속적인 메모리를 보유하게 될 것입니다. 그것은 ... 기본적으로 포인터의 배열입니다
— josaphatv

"T가 참조 유형 인 경우에는 해당되지 않을 것입니다."- T[]OP는 "액세스 대 표준 어레이에 대한 성능 저하 없음"을 요구했으며이를 List<T>제공합니다. T참조 유형 인 경우 T*C ++에서와 유사 하므로 C ++에서만큼 연속성을 얻습니다. 객체 자체가 연속적이기를 원한다면 물론 두 언어 모두에서 값 유형이 필요합니다. 물론 차이점은 C ++에서는 모든 유형이 값 또는 참조로 사용될 수있는 반면, C #에서는 클래스 / 구조체 구분을 통한 유형의 속성이라는 것입니다.
— Jim Balter 2015-07-28

오늘 뭔가를 배웠습니다. 나는 List<T>항상 내부적으로 연결된 목록으로 구현 되었다고 생각했습니다 . 그렇다면 우리가 호출하면 어떻게 동적으로 확장 Add()됩니까? Redim Preserve전체 어레이를 새 위치로 복사하는 데 사용되는 VB6과 같은 것 입니까?
— dotNET

@dotNet은 내부적 List<T>으로 작은 배열을 만듭니다 T[]. 항목은 내부적으로 배열에 추가됩니다. 배열의 크기가 완료되면 이전 배열의 두 배 크기로 새 배열이 생성됩니다. 데이터는 더 큰 새 어레이로 복사되고 더 작은 어레이는 파괴됩니다. 개발자는 List via 생성자 를 채우기 전에 충분히 큰 내부 배열을 만들기 위해 .NET에 힌트를 줄 수 있습니다 new List<T>(expected_array_size).
— Artru

16

를 사용하십시오 List<T>. 내부적으로 그것은 배열을 사용하고 배열은 연속적인 메모리를 사용합니다.


2
전적으로 사실이 아닙니다. T가 참조 유형이면 연속 메모리가 없습니다.
— Matteo Mosca 2011 년

2
@Matteo 소스를 보면 private T[] _items;백엔드 저장소, 참조 유형에 사용 되는지 여부가 있습니다 .
— Bala R

13
글쎄, 나도 알아. 그러나 나에게 말해줘. List <SomeClass>가 있습니다. SomeClass 인스턴스에 대한 참조는 연속 메모리에 저장되지만 인스턴스 자체는 저장되지 않습니다. 참조 유형은 힙에 있으며 힙이 어떻게 작동하는지 확실히 알고 있습니다.
— Matteo Mosca 2011 년

참조를 연속적으로 저장하는 @MatteoMosca는 적어도 한 수준의 간접 참조를 제거합니다. 내가 추측하는 것보다 낫다.
— Tim Seguine 2014

7
@MatteoMosca OP는 "표준 어레이에 비해 액세스에 대한 성능 저하 없음"을 요구했습니다. T가 무엇인지에 관계없이 List <T>에 해당하므로이 페이지에 대한 모든 댓글은 오프 포인트입니다.
— Jim Balter 2015

16

우선 Arraylist또는 에서 멀리 떨어져 있습니다 Hashtable. 이러한 클래스는 제네릭을 위해 사용되지 않는 것으로 간주됩니다. 레거시 목적을 위해 여전히 언어로되어 있습니다.

자, 당신이 찾고있는 것은 List<T>수업입니다. T가 값 유형이면 연속적인 메모리를 갖게되지만 T가 참조 유형 인 경우에는 분명한 이유가 없습니다.


14

C #에는 많은 참조 유형이 있습니다. 컨테이너가 참조를 연속적으로 저장하더라도 객체 자체가 힙을 통해 흩어질 수 있습니다.


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