2013-09-08 30 views
9

Nếu tôi khai báo một danh sách các mảng char, chúng được cấp phát trong bộ nhớ liền kề hay .NET tạo danh sách liên kết thay thế?Danh sách C# <char[]> được cấp phát trong bộ nhớ tiếp giáp?

Nếu nó không tiếp giáp, có cách nào tôi có thể khai báo một danh sách liền kề của mảng char? Kích thước của mảng char là biết trước thời hạn và được cố định (tất cả chúng đều có cùng kích cỡ).

+0

Tôi đoán tôi có thể khai báo Danh sách và chỉ theo dõi thủ công ranh giới. Điều đó sẽ được lưu trữ trong bộ nhớ liền kề, phải không? – David

+0

Yup, đó là những gì tôi gợi ý. Đó là cách duy nhất để làm điều này. Chỉ tò mò thôi; tại sao bạn cần chúng được tiếp giáp và hành động giống như một mảng lớn ở nơi đầu tiên? Suy nghĩ của tôi là nhảy giữa các mảng sẽ không quan trọng nhiều như nó sẽ xảy ra không thường xuyên khi so sánh với số lượng nhảy xảy ra giữa các phần tử khi lặp lại các mảng riêng lẻ. –

+0

Nó dành cho lớp AI. Dữ liệu không tiếp giáp sẽ ảnh hưởng đến thời gian thực hiện của thuật toán, và làm tổn thương lớp của tôi :) – David

Trả lời

11

Có, nhưng không theo cách mà bạn muốn. List<T> đảm bảo rằng các phần tử của nó được lưu trữ liên tục.

Mảng là loại tham chiếu, vì vậy các tham chiếu được lưu trữ gọn gàng như bảo đảm List<T>. Tuy nhiên, bản thân các mảng được phân bổ riêng biệt và nơi chúng được lưu trữ không liên quan gì đến danh sách. Nó chỉ quan tâm đến các yếu tố của nó, các tham chiếu.

Nếu bạn yêu cầu điều đó thì bạn chỉ cần sử dụng một mảng lớn và duy trì dữ liệu ranh giới.

EDIT: mỗi bình luận của bạn:

Các mảng bên trong luôn 9 ký tự.

Vì vậy, trong trường hợp này, sự kết hợp bộ nhớ cache có thể là một vấn đề vì các mảng phụ quá nhỏ. Bạn sẽ được nhảy xung quanh rất nhiều trong bộ nhớ nhận được từ một mảng đến tiếp theo, và tôi sẽ chỉ đưa bạn về từ của bạn về độ nhạy hiệu suất của mã này.

Chỉ cần sử dụng đa chiều nếu bạn có thể. Điều này tất nhiên giả định bạn biết kích thước hoặc bạn có thể áp đặt một kích thước tối đa trên đó.

Có thể giao dịch một số bộ nhớ để giảm độ phức tạp/thời gian và chỉ cần đặt kích thước tối đa cho N? Sử dụng mảng đa chiều (nhưng không sử dụng sau) là cách duy nhất bạn có thể đảm bảo phân bổ liền kề.

CHỈNH SỬA 2:

Cố gắng giữ câu trả lời đồng bộ với nhận xét. Bạn nói rằng kích thước tối đa của thứ nguyên đầu tiên là 9! và, như trước đây, kích thước của thứ nguyên thứ hai là 9.

Phân bổ tất cả lên phía trước. Bạn đang giao dịch một số bộ nhớ cho thời gian. 9! * 9 * 2/1024/1024 == ~ 6,22MB.

Như bạn nói, Danh sách có thể tăng lên với kích thước đó, vì vậy trường hợp xấu nhất bạn lãng phí một vài MB bộ nhớ. Tôi không nghĩ rằng nó sẽ là một vấn đề, trừ khi bạn có kế hoạch chạy mã này trong lò nướng bánh. Chỉ cần phân bổ bộ đệm như một mảng lên phía trước và bạn tốt.

+0

oh, phải. Duh. Cảm ơn – David

+0

Dù các mảng có răng cưa nhanh hay chậm hơn các mảng đa chiều có thể phụ thuộc vào mẫu truy cập của bạn. Các mảng đa chiều tiếp giáp nhau, vì vậy CPU có thể tìm nạp trước dữ liệu từ nó một cách dễ dàng. Nếu mã của bạn thực hiện quét tuyến tính thông qua mảng tôi mong đợi nó sẽ nhanh hơn trên các mảng đa chiều hơn trên các mảng răng cưa (nếu các mảng đủ lớn). – Mehrdad

+0

@Mehrdad: Vâng, tôi thực sự có ý định xóa bit đó sau khi OP cung cấp cho tôi thêm thông tin. Cảm ơn –

5

List hoạt động dưới dạng dynamic array, không phải là danh sách được liên kết, nhưng điều này là bên cạnh điểm. Sẽ không có bộ nhớ nào được phân bổ cho số char[] cho đến khi chúng được khởi tạo. Các List là chỉ chịu trách nhiệm giữ tài liệu tham khảo để char[] s, trong đó nó sẽ không chứa gì khi lần đầu tiên tạo ra.

Nếu nó không tiếp giáp, có cách nào tôi có thể khai báo danh sách tiếp giáp của mảng char không? Kích thước của mảng char là biết trước thời hạn và được cố định (tất cả chúng đều có cùng kích cỡ).

Không, nhưng bạn có thể nhanh chóng một 2-dimensional array của chars, nếu bạn cũng biết có bao nhiêu mảng char thì sẽ có:

char[,] array = new char[x, y]; 
+0

Tôi nghĩ Danh sách đã tạo danh sách được liên kết nếu kiểu dữ liệu là tham chiếu? – David

+2

@David: Không. 'Danh sách ' có ngữ nghĩa của một mảng, không bao giờ là một danh sách liên kết. Ví dụ, bạn có thể lập chỉ mục vào nó. Đó sẽ là một thủ đoạn khó chịu nếu chỉ số là O (n) trong thời gian (vì nó sẽ là cho LL) –

+0

Điều cần biết. Cảm ơn. – David

Các vấn đề liên quan