2010-09-29 37 views

Trả lời

9

Nó là một chi tiết thực hiện của trình biên dịch JIT. Nó sẽ cố gắng rất nhiều để lưu trữ các biến địa phương trong một thanh ghi CPU, rất hiệu quả. Ngăn xếp là cửa hàng sao lưu thông thường, trong trường hợp không có đủ đăng ký để lưu trữ tất cả các biến cục bộ.

Sự khác biệt lớn giữa ví dụ x86 và x64 chẳng hạn. x64 có nhiều đăng ký hơn. Điều này cũng áp dụng cho các đối số được truyền cho một phương thức. x86 cho phép 2 được thông qua trong một thanh ghi CPU, x64 cho phép 4. Thêm bất cứ thứ gì có thể được lưu trữ trong ngăn xếp FPU hoặc các thanh ghi XMM. Vì vậy, thực sự có bốn địa điểm khác nhau mà một biến cục bộ có thể được lưu trữ.

+0

+1, có rất nhiều sự nhầm lẫn về người dân địa phương và các thông số khi nói đến IL. IL làm việc với một chồng hoạt động, nhưng điều này không trực tiếp tương ứng với một 'ngăn xếp cuộc gọi', chẳng hạn như được tạo ra bởi một trình biên dịch C với quy ước gọi là 'cdecl' hoặc 'stdcall'. Cả hai đối số và người dân địa phương được coi là các vùng được đánh số; vùng duy nhất có sự tương đồng với ngăn xếp cuộc gọi là khi các tham số cho một cuộc gọi phương thức được bật từ ngăn xếp hoạt động để nạp vào các khe đối số cho cuộc gọi phương thức. –

4

Nếu đối tượng không phải là loại giá trị, nó được cấp phát trên heap và tham chiếu đến đối tượng đó được lưu trữ trên ngăn xếp. Nếu không, nó được cấp phát trực tiếp trên ngăn xếp.

9

Trên ngăn xếp có thông số. .. NHƯNG .....
1) đối với các loại tham chiếu, chỉ tham chiếu được lưu trữ trên ngăn xếp chứ không phải đối tượng mà nó đề cập đến. Các đối tượng thực tế được lưu trữ trên heap.
2) đối với các loại giá trị, giá trị thực được lưu trữ trên ngăn xếp.

Bây giờ, khi luồng thực thi trong phương thức đạt đến dấu ngoặc đóng, dữ liệu kiểu giá trị trên ngăn xếp bị hủy và sau đó, trong khi đối tượng kiểu tham chiếu trên đống (tham chiếu có ở đây trên ngăn xếp của phương thức này) bàn giao cho hệ thống thu gom rác để thu gom tại thời điểm thích hợp do chính người thu gom rác quyết định.

+2

Điều này cũng rất gây hiểu nhầm cho cùng một lý do như trong câu trả lời được đánh dấu. Thêm vào đó là hầu hết chắc chắn không có phá hủy đang xảy ra. Không phải trong mã IL hay mã máy. Vị trí ngăn xếp chỉ đơn giản là bị bỏ rơi và cuối cùng bị ghi đè bởi một khung ngăn xếp kích hoạt khác. Ngay cả khái niệm rằng các kiểu tham chiếu nằm trên heap không chính xác. Các chuỗi được lưu trữ thực sự được lưu trữ trong vùng bộ nạp, cùng một nơi mà các biến tĩnh được lưu giữ. Chi tiết, chi tiết. –

+0

@Hans: cảm ơn các chi tiết ... đánh giá cao sự giải thích của bạn. – explorer

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