2011-01-13 35 views

Trả lời

14

Đối với CLR 32 bit, cả hai sẽ có 4 byte cho khóa, 4 byte cho loại xử lý và 8 byte cho hai int. Các mảng, tuy nhiên, sẽ có thêm 4 byte để lưu trữ chiều dài (2 trong trường hợp này), do đó, mảng sẽ có 4 byte trên không.

kích cỡ (xác định bởi profiling) trên 32-bit:
Tuple<int, int>: 16 byte
int[2]: 20 byte
int[1 to 2] *: 28 byte
int[2, 1]: 36 byte
Trên một CLR 64-bit:
Tuple<int, int>: 24 byte
int[2]: 32 byte
int[1 to 2] *: 40 byte
int[2, 1]: 48 byte

Lưu ý rằng các mảng giá trị không dựa trên đơn chiều không là các mảng nhỏ nhất có thể. Sử dụng các kiểu tham chiếu thêm 4 byte khác cho kiểu đối tượng đang được lưu trữ (8 byte trên 64 bit). Việc sử dụng các cơ sở mảng khác hoặc nhiều tham số làm cho nó sử dụng một loại kiểu mảng khác để lưu trữ thông tin xếp hạng và giới hạn dưới, thêm 8 byte bổ sung cho mỗi thứ nguyên.

Tài liệu tham khảo:

* Bạn không thể khai báo một mảng với một tổ chức phi-0 bị ràng buộc trong C# thấp hơn, vì vậy tôi đã lên cú pháp int[1 to 2]. Tuy nhiên, bạn có thể gọi Array.CreateInstance(typeof(int), new[]{2}, new[]{10}); để tạo một mảng với 2 phần tử, tại chỉ mục 10 và 11. Tất nhiên vì các mảng như vậy không thể được biểu diễn trực tiếp trong hệ thống kiểu của C#, chúng không hữu ích lắm, nhưng chúng cung cấp một điểm dữ liệu thú vị.

+0

Mảng là một trường hợp đặc biệt, ngay cả những trường hợp được tối ưu hóa IL và do đó chúng có thêm chi phí bổ sung trong chính CLI. –

0

A Tuple<int, int> sử dụng cùng một bộ nhớ làm lớp với hai trường số nguyên. Mặt khác, mảng có cấu trúc dữ liệu nội bộ khá lớn (gọi là ArrayOpScript trong số SSCLI) ít nhất 32 byte cộng với cấu trúc dữ liệu khác (được gọi là ArrayOpIndexSpec) cho mỗi cấp (trong trường hợp này) có kích thước 16 byte. Vì vậy, một mảng gần như chắc chắn sử dụng nhiều yếu tố nhiều bộ nhớ hơn một Tuple.

+0

Hồ sơ của tôi trên .Net 4 CLR cho thấy rằng ngay cả một mảng đa chiều chỉ lớn hơn 20 hoặc 24 byte so với lớp 2-int. – Gabe

+0

Tôi nên chỉ cần đo nó đầu tiên thay vì cố gắng lý luận và suy đoán. Các phép đo của tôi hiển thị trong .NET4 x86 CLR một int [2] chỉ tiêu thụ ~ 20% bộ nhớ nhiều hơn một Tuple , phù hợp với câu trả lời của bạn. –

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