C # tương đương với vector C ++, với bộ nhớ liền kề?


85

C # tương đương với vector C ++ là gì?

Tôi đang tìm kiếm tính năng này:

Để có một mảng động của bộ nhớ được lưu trữ liền kề không bị phạt về hiệu suất đối với quyền truy cập so với mảng tiêu chuẩn.

Tôi đã tìm kiếm và họ nói .NET equivalent to the vector in C++ is the ArrayList, vì vậy:

ArrayList có tính năng bộ nhớ liền kề đó không?


4
Không phải CLR không đủ gần với kim loại để bạn chỉ định (hoặc thậm chí luôn mong đợi) cách một cấu trúc được cấp phát trong bộ nhớ?
Aphex

Câu trả lời:


101

Bạn có thể sử dụng một List<T>và khi nào Tlà một kiểu giá trị, nó sẽ được cấp phát trong bộ nhớ liền kề, điều này sẽ không đúng nếu Tlà một kiểu tham chiếu.

Thí dụ:

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

int someElement = integers[1];

2
@cMinor, tài liệu của List<T>lớp có nhiều ví dụ nhưng tôi đã cập nhật câu trả lời của mình để đưa vào.
Darin Dimitrov

5
Tôi không quen thuộc 100% với CLR, nhưng có nghĩa là ngay cả khi Tlà một loại tham chiếu, bạn vẫn sẽ có bộ nhớ liền kề. Đó là cơ bản một mảng của con trỏ ...
josaphatv

"sẽ không đúng nếu T là một kiểu tham chiếu" - nó cũng giống như trường hợp T[]... OP yêu cầu "không có hình phạt hiệu suất đối với quyền truy cập so với mảng tiêu chuẩn" và List<T>cung cấp điều đó. Và nếu Tlà một kiểu tham chiếu, tương tự như T*trong C ++, vì vậy bạn sẽ có được sự liền kề nhiều như trong C ++. Nếu một người muốn các đối tượng tiếp giáp với nhau, thì tất nhiên người ta cần các kiểu giá trị ... trong cả hai ngôn ngữ. Tất nhiên, sự khác biệt là trong C ++, bất kỳ kiểu nào cũng có thể được sử dụng làm giá trị hoặc tham chiếu, trong khi trong C #, nó là một thuộc tính của kiểu thông qua sự phân biệt class / struct.
Jim Balter

Hôm nay đã học được điều gì đó. Tôi nghĩ List<T>luôn được triển khai dưới dạng danh sách liên kết trong nội bộ. Vì vậy, làm thế nào để nó mở rộng động sau đó khi chúng ta gọi Add()? Một cái gì đó giống như VB6 Redim Preserveđược sử dụng để sao chép toàn bộ mảng sang một vị trí mới?
dotNET

@dotNet, nội bộ List<T>tạo một mảng nhỏ T[]. Các mục nội bộ được thêm vào mảng. Khi kích thước của mảng được hoàn thành, một mảng mới sẽ được tạo ra có kích thước gấp đôi kích thước của mảng trước đó. Dữ liệu được sao chép sang mảng mới lớn hơn, mảng nhỏ hơn bị hủy, v.v. Một nhà phát triển có thể cung cấp một gợi ý cho .NET để tạo ra một mảng đủ nội lớn trước khi điền các List thông qua constructor: new List<T>(expected_array_size).
Artru

16

sử dụng List<T>. Bên trong nó sử dụng mảng và mảng sử dụng bộ nhớ liền kề.


2
Không hoàn toàn đúng. Nếu T là một kiểu tham chiếu, sẽ không có bộ nhớ liền kề.
Matteo Mosca

2
@Matteo nếu bạn nhìn vào nguồn, có được private T[] _items;sử dụng để lưu trữ phụ trợ, loại tham chiếu hay không.
Bala R

13
Tôi biết điều đó. Nhưng hãy nói cho tôi. Bạn có một Danh sách <SomeClass>. Các tham chiếu đến các cá thể SomeClass sẽ được lưu trữ trong bộ nhớ liền kề, nhưng không được lưu trữ trong chính các cá thể đó. Là các loại tham chiếu, chúng sẽ nằm trong heap và bạn chắc chắn biết cách hoạt động của heap.
Matteo Mosca

@MatteoMosca lưu trữ các tham chiếu liền kề nhau ít nhất loại bỏ một mức chuyển hướng. Tốt hơn là không có gì tôi đoán.
Tim Seguine

7
@MatteoMosca OP đã yêu cầu "không có hình phạt hiệu suất đối với quyền truy cập so với mảng tiêu chuẩn". Điều đó đúng với Danh sách <T> bất kể T là gì, vì vậy tất cả các nhận xét của bạn trên trang này đều không đúng.
Jim Balter

16

Trước hết, hãy tránh xa Arraylisthoặc Hashtable. Các lớp đó sẽ được coi là không được dùng nữa, thay vì các lớp chung. Chúng vẫn được sử dụng trong ngôn ngữ cho các mục đích kế thừa.

Bây giờ, những gì bạn đang tìm kiếm là List<T>lớp học. Lưu ý rằng nếu T là một kiểu giá trị, bạn sẽ có bộ nhớ contiguos, nhưng không phải nếu T là một kiểu tham chiếu, vì những lý do rõ ràng.


14

C # có rất nhiều kiểu tham chiếu. Ngay cả khi một vùng chứa lưu trữ các tham chiếu liền nhau, bản thân các đối tượng có thể nằm rải rác trong đống


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.