2009-12-21 8 views
5

Một số câu hỏi học thuật, nhưng: Các loại giá trị như Int thực sự như thế nào hoạt động?Loại Giá trị thực sự hoạt động như thế nào trong .net?

Tôi đã sử dụng Trình phản xạ trên mscorlib để tìm hiểu cách System.Int32 được triển khai và nó chỉ là một cấu trúc kế thừa từ System.ValueType. Tôi đang tìm kiếm thứ gì đó trong số các dòng của một mảng bit giữ giá trị, nhưng tôi chỉ tìm thấy một trường được khai báo int - có nghĩa là nó là một tham chiếu vòng tròn?

Ý tôi là, tôi có thể viết "int i = 14;", nhưng số 14 cần phải được lưu trữ ở đâu đó bằng cách nào đó, nhưng tôi không thể tìm thấy "Mảng 32 bit" hoặc Con trỏ hay gì đó.

Đây có phải là một số phép thuật mà trình biên dịch thực hiện và các loại ma thuật này có phải là một phần của đặc điểm kỹ thuật không? (Tương tự như cách System.Attribute hoặc System.Exception là loại "đặc biệt")

Chỉnh sửa: Nếu tôi khai báo cấu trúc của riêng mình, tôi thêm trường vào đó. Các trường đó có kiểu tích hợp, ví dụ int. Vì vậy, CLR biết rằng tôi giữ một int. Nhưng làm thế nào nó biết rằng một int là 32-bit, đã ký? Có phải chỉ đơn giản là Đặc tả chỉ định một số loại cơ sở nhất định và do đó khiến chúng trở thành "ma thuật", hoặc có cơ chế kỹ thuật không? Ví dụ giả thuyết: Nếu tôi muốn khai báo một Int36, đó là một số nguyên với 36 bit, tôi có thể tạo kiểu hoạt động chính xác như Int32 (ngoài 4 bit phụ) bằng cách chỉ định "OK, đặt sang một bên 36 bit ", hoặc được xây dựng trong nguyên thủy đặt trong đá và tôi sẽ phải bằng cách nào đó làm việc xung quanh này (tức là bằng cách sử dụng một Int64 và mã mà chỉ đặt 36 bit cuối cùng)?

Như đã nói, tất cả đều rất khoa học và giả thuyết, nhưng tôi luôn tự hỏi về điều đó.

+0

Câu hỏi hay, tôi đã tự hỏi bản thân mình là gì. – Pierreten

+0

Tôi cũng vậy, tôi đã hy vọng câu hỏi là về cách các loại giá trị hoạt động, tức là stack vs heap được phân bổ, nhưng tôi tò mò về điều này. – Davy8

+1

Chỉnh sửa của bạn: theo như tôi có thể nói, nếu bạn muốn tạo một Int36, bạn sẽ phải bằng cách nào đó mô tả nó trong C# hoặc IL, mà sẽ buộc bạn phải sử dụng Int32 + Int8 hoặc Int64 với 28 bit bị bỏ qua hoặc bất cứ điều gì. Cách duy nhất để thêm Int36 vào máy ảo nằm bên dưới và hiểu nó là biểu diễn mức bit sẽ thực hiện CLR riêng của bạn là la Mono hoặc Rotor. – itowlson

Trả lời

3

Một số kiểu nguyên thủy nhất định như số nguyên là một phần của đặc tả CLI. Ví dụ, có các hướng dẫn IL cụ thể như ldc.i4 để tải các giá trị của các loại này và các hướng dẫn IL như thêm có kiến ​​thức cụ thể về các loại này. (Ví dụ bạn của int i = 14 sẽ được biên soạn để ldc.i4 14, với 14 đại diện trong nội bộ như một phần của opcode trong MSIL được biên dịch.)

Mọi chi tiết, thấy IIa phân vùng của CLI spec, Phần 7.2, "Built-in các loại . " (Không thể tìm thấy một liên kết đến phần cụ thể, xin lỗi.) Các kiểu dựng sẵn là: bool, char, đối tượng, chuỗi, float32, float64, int [8 | 16 | 32 | 64], unsigned int [8 | 1632 | 64], int gốc (IntPtr), int không dấu bản địa và typedref. Ghi chú đặc tả rằng chúng có các kiểu giá trị tương ứng được định nghĩa trong Thư viện lớp cơ sở, điều này khiến tôi nghĩ rằng Int32 thực sự là loại trình bao bọc siêu dữ liệu xung quanh int32 "thực", nằm ở mức VES.

Các loại giá trị khác, như System.Decimal, System.Drawing.Point hoặc bất kỳ cấu trúc nào bạn xác định trong mã của riêng bạn, đều không phải là điều kỳ diệu.

+0

Cảm ơn. Vì vậy, trong ví dụ Int36 giả định của tôi, tôi không có tùy chọn nào khác ngoài việc sử dụng loại được tích hợp (tức là Int64 hoặc bool [36]) và mã hóa phần còn lại của loại của tôi theo cách thủ công? –

+0

Chính xác. Xem nhận xét "chỉnh sửa lại của bạn" về câu hỏi của bạn. Bạn không có quyền truy cập vào mức bit-twiddling trừ khi bạn thực hiện CLR của riêng bạn. – itowlson

1

Int32 là loại trình biên dịch nội tại, có nghĩa là trình biên dịch có logic đặc biệt để xử lý nó. Việc thực hiện thực tế của Int32 trong khuôn khổ là vô nghĩa.

Cần lưu ý rằng Int16, Int32, UInt16, UInt32, Đơn, Đôi, v.v. tương ứng với các loại có nguồn gốc từ tập lệnh x86 (và các lệnh khác). Việc tạo kiểu Int36 cũng sẽ yêu cầu sử dụng kiểu gốc làm nền tảng trong mã assembly thuần túy.

+0

Cảm ơn. Yeah, tôi đoán tôi sẽ chạy vào tất cả các loại vấn đề hiệu suất anyway (liên kết/padding, đòi hỏi 2 lần đọc/viết trên ia32 vv ...). –