2013-06-10 33 views
5

Tôi đang đọc C# theo chiều sâu của Jon Skeet. Trích dẫn từ chương thứ ba:Trình biên dịch JIT xử lý các loại giá trị như thế nào?

Các JIT có thể điều trị các loại giá trị theo một cách đặc biệt thông minh quản lý để loại bỏ boxing và unboxing trong nhiều tình huống. Trong một số trường hợp , điều này có thể tạo sự khác biệt lớn về hiệu suất về cả mức tiêu thụ bộ nhớ và tốc độ .

Ai đó có thể giải thích chính xác điều này có nghĩa là gì, tốt nhất là với ví dụ?

+1

'Jon' không' John' :) –

+0

* Quyền anh * mô tả quá trình lưu loại giá trị dưới dạng 'đối tượng', ví dụ:' object o = 13; ', trong khi * unboxing * mô tả quá trình truy xuất giá trị từ đối tượng: 'int thirteen = (int) o;'. Đó có phải là điều bạn muốn biết không? – Nolonar

+1

KHÔNG. Tôi muốn ý nghĩa chính xác của câu nói trên "JIT có thể điều trị các loại giá trị một cách đặc biệt thông minh để quản lý để loại bỏ quyền anh và unboxing trong nhiều tình huống. Trong một số trường hợp, điều này có thể tạo ra sự khác biệt lớn về hiệu suất cả về tốc độ và tiêu thụ bộ nhớ. " – amitabha

Trả lời

1

Hãy lấy List<int> làm ví dụ. Điều đó được hỗ trợ bởi chính hãng int[] và JIT sẽ biên dịch mã cụ thể cho đối số loại int, để bất kỳ mã nào sử dụng một số T trong phạm vi List<T> sẽ nhận được bất kỳ tối ưu nào như mã được viết chỉ cho số nguyên.

Hãy so sánh điều này với Generics Java, nơi chỉ có những lý lẽ kiểu hợp lệ là các loại lớp - vì vậy mặc dù nó có giá trị viết:

// Java code! 
List<Integer> integers = new ArrayList<Integer>(); 
integers.add(10); 
int x = integers.get(0); // x = 10 

Đó thực hiện một boxing và unboxing hoạt động ở chế độ nền. Mã C# tương đương sẽ không liên quan đến đấm bốc.

+0

Rất nhiều người cảm ơn Jon.But Jon Bạn có thể plz exaplain dòng dưới đây được đề cập công phu hơn. Dòng này là: để bất kỳ mã nào sử dụng một T trong Danh sách sẽ nhận được bất kỳ tối ưu hóa nào nếu như mã đã được viết chỉ cho các số nguyên. – amitabha

0

Tôi nghĩ Jon cho rằng nhiều loại này không được coi là đối tượng thuộc loại xác định của nó. Ví dụ; một int không phải được coi là một cấu trúc và có thể được xử lý trực tiếp trong thanh ghi. Việc thêm hai số nguyên không được xử lý bởi các cuộc gọi toán tử quá tải mà được thực hiện trực tiếp bằng cpu.

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