Như bạn đã biết, có một số bước từ mã C# để mã nguồn gốc đó là:
- Biên dịch từ C# để IL (bytecode)
- JITting từ bytecode để mã gốc
C# không có bất kỳ sự kiểm soát nào về thời gian khi bộ nhớ được cấp phát, những gì bạn gọi là ràng buộc, điều này hoàn toàn phụ thuộc vào JIT. Nhận được điều này ra khỏi con đường của chúng ta hãy xem những gì là trong kiểm soát của C#. Mã byte do C# tạo ra phải tuân theo tiêu chuẩn CLR ECMA. Nếu chúng ta đi đến phần 12.1.6.1 của phân vùng 1, chúng ta sẽ thấy rằng tiêu chuẩn xác định rằng nhà của biến cục bộ là trong tiêu đề phương thức. Vì chữ ký của phương thức như quy tắc có xu hướng hiển thị ở đầu phương thức trong danh sách, bạn nhận được một hiển thị (sai) rằng chúng là bị ràng buộc trả trước, trong thực tế có thể có hoặc không có thể xảy ra.
Nếu bạn đang xem mã nguồn gốc được biên dịch, kết quả có thể thay đổi từ nền tảng này sang nền tảng khác. Việc phân bổ không gian lịch sử trên ngăn xếp CPU cho một biến cục bộ được thực hiện bằng một lệnh CPU duy nhất để thay đổi con trỏ ngăn xếp. Nếu bạn muốn biến nó theo biến thì bạn sẽ có nhiều hướng dẫn, một biến cho mỗi biến, ít hiệu quả hơn. Đây là lý do tại sao, ít nhất là trên x86 bạn sẽ thấy rằng không gian trên ngăn xếp CPU được phân bổ trả trước.
Nguồn
2012-02-02 00:40:07
Tại sao điều chỉnh kích thước ngăn xếp tăng lên bất kỳ tốt hơn so với đặt trước tất cả? – ildjarn
có lẽ, phải mất một thời gian để lộn xộn với ngăn xếp ... nếu tôi có nhiều biến cục bộ, tại sao phải đợi chúng khi tôi không phải (chưa)? – GWLlosa
Phải, phải mất một thời gian để lộn xộn với chồng, do đó, làm tất cả lên phía trước thay vì hơn và hơn mỗi khi một biến mới đi vào phạm vi là chính xác những gì được thực hiện. – ildjarn