2013-10-31 12 views
5

Trong "C# theo chiều sâu" của Jon Skeet Tôi đang đọc đó (p 511.):Mảng không hỗ trợ trực tiếp trong CLR

Tất cả các mảng xuất phát từ System.Array, và họ là những chỉ bộ sưu tập với hỗ trợ trực tiếp trong CLR (nhấn mạnh của tôi).

Tôi tự hỏi điều này có ý nghĩa chính xác, đặc biệt là liên quan đến các loại không có hỗ trợ này. Tất cả các loại không có sự hỗ trợ này được lắp ráp từ các loại do CLR thực hiện khi nó diễn giải IL? Các loại không có hỗ trợ này không được CLR biết đến?

Cũng trên p. 512 của sách:

Trình biên dịch C# có hỗ trợ sẵn cho mảng theo nhiều cách.

Điều này có liên quan đến hỗ trợ trực tiếp loại mảng có trong CLR hoặc hai điều riêng biệt này hoàn toàn không?

+0

Có vẻ ngớ ngẩn khi cố gắng trả lời khi ông Skeet tự mình có thể đưa ra một câu trả lời tốt hơn ... :) –

+2

Hãy xem [Danh sách hướng dẫn CIL] (http://en.wikipedia.org/wiki/List_of_CIL_instructions). Có rất nhiều opcodes mà đối phó với mảng, nhưng không ai mà đối phó với các bộ sưu tập khác. – tom

Trả lời

7

Như được mô tả, các mảng tồn tại sâu trong CLR. Có các hướng dẫn IL để tương tác với chúng (ldelem.*/stelem.*). Chúng đã được cập nhật từ trước, và cho phép các mảng khác nhau được tạo ra theo yêu cầu. Đây không phải là trường hợp đối với các loại bộ sưu tập khác - ví dụ: List<T> là trình bao bọc tồn tại ở trên cùng của một mảng. CLR không cần bất kỳ kiến ​​thức đặc biệt nào về List<T> - chỉ IL thông thường để truy cập nội dung của các mảng hiện có hoặc phân bổ các mảng mới. Các hình thức chính khác của bộ sưu tập được liên kết danh sách (và tương tự; cây, vv) - nhưng một lần nữa, những không cần hỗ trợ đặc biệt - đây chỉ là các đối tượng kết nối cùng với tài liệu tham khảo.

4

Có, bộ ba trình biên dịch, jitter và CLR có rất nhiều kiến ​​thức được xây dựng trong mảng. Điều này là khá cần thiết cho bất kỳ thời gian chạy ngôn ngữ nào, nó không thể bỏ qua các khả năng của bộ vi xử lý. Để làm cho mã chạy một cách hiệu quả, nó phải ánh xạ tới những gì mà một bộ xử lý có thể làm tốt.

Điều này không nhiều, bộ xử lý là những thiết bị khá đơn giản. Họ cung cấp không hỗ trợ thực sự cho các loại cấu trúc dữ liệu bạn muốn sử dụng trong một chương trình. Cách ngôn ngữ và thời gian chạy được thiết kế cho thấy nhiều chi tiết triển khai bộ xử lý cơ bản.

Khái niệm về ngăn xếp có mặt là ở khắp mọi nơi chẳng hạn. Một lượng nhỏ bộ nhớ mà một bộ xử lý có thể truy cập trực tiếp thông qua con trỏ ngăn xếp của nó. Đó là lý do tại sao ngôn ngữ C#, như hầu như bất kỳ ngôn ngữ nào, có khái niệm về một biến cục bộ bên trong một phương thức. Đó là một biến sẽ được lưu trữ trên ngăn xếp. Bộ vi xử lý cũng hỗ trợ mạnh mẽ khái niệm các phương thức gọi với các đối số trả về một giá trị duy nhất, về phổ quát trong bất kỳ ngôn ngữ nào. Lượng bộ nhớ nhỏ được cấp cho ngăn xếp đã đặt tên cho trang này.

Loại giá trị là một ví dụ .NET khác về chi tiết bộ xử lý cơ bản. Chúng trực tiếp ánh xạ tới bộ xử lý tốt khi xử lý các giá trị. An int ánh xạ trực tiếp vào sổ ghi vi xử lý chẳng hạn. Float và double trực tiếp ánh xạ tới khả năng của bộ xử lý để lưu trữ các giá trị đó và thực thi các lệnh dấu phẩy động bằng cách sử dụng hai loại đó.

Và một mảng là cấu trúc dữ liệu một và duy nhất mà bộ xử lý có thể hỗ trợ. Rất đơn giản, một đoạn bộ nhớ với một con trỏ để truy cập bộ nhớ đó.Rất được tối ưu hóa rất nhiều trong .NET để làm điều đó hiệu quả nhất có thể. Với một cái gật đầu đặc biệt là "vectơ", một loại mảng được xử lý đặc biệt. Mảng một chiều có chỉ số bắt đầu bằng 0, loại mảng trực tiếp ánh xạ tới bộ phận hỗ trợ bộ xử lý. Bạn nhận được một vector trong C# với khai báo type[]. Bạn cũng thấy các hạn chế mảng trở lại từ đó, .NET tạo ra nếu rất khó để tạo một mảng với chỉ mục bắt đầu không phải 0. Vì một lý do rất tốt, việc lập chỉ mục một mảng như vậy là tốn kém vì nó yêu cầu một phép trừ phụ để ánh xạ lập chỉ mục cho đoạn bộ nhớ. Việc kiểm tra chỉ số mảng là một mục tiêu mạnh mẽ khác để tối ưu hóa, kiểm tra giới hạn là tốn kém. Rất nhiều smarts được xây dựng trong jitter để nhận ra rằng một vòng lặp không bao giờ có thể lập chỉ mục một mảng ngoài giới hạn, cho phép kiểm tra chỉ mục được loại bỏ hoàn toàn.

Bất kỳ cấu trúc dữ liệu nào cần được xây dựng trên đầu trang của bộ phận hỗ trợ bộ xử lý chỉ cho mảng trống. Đó là lý do tại sao bạn thấy điều đó được thực hiện bên trong các lớp sưu tập .NET. Không có sự trợ giúp thêm từ CLR hoặc jitter vì có rất ít điều họ có thể làm để làm cho nó nhanh hơn. Cũng là lý do mà các lớp thu thập này được xây dựng trên đỉnh của các mảng vectơ. Giống như Danh sách <>, không phải danh sách giống với loại bạn thấy trong sách văn bản thuật toán dữ liệu của bạn, thực ra là một mảng. Hoặc Từ điển <>, antipode của một mảng nhưng vẫn được triển khai với chúng.

+0

Cảm ơn bạn vì câu trả lời phức tạp này. Làm cho các khái niệm rõ ràng hơn rất nhiều. – bump

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