연속 메모리가있는 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.