2009-04-04 34 views
9

Có cách nào trong .NET, sử dụng Reflection.Emit, để truy cập mục trên cùng nhưng một từ ngăn xếp? Vì vậy, nếu A là trên cùng, và B tiếp theo - Tôi muốn xử lý B sau đó A. Nó sẽ là tốt để sao chép B trên A (kể từ khi tôi có thể chỉ đơn giản là "bật" B thứ hai khi tôi nhận được nó).Reflection.Emit - truy cập mục top-nhưng-một từ ngăn xếp

Hiện nay, tôi đang tuyên bố một địa phương:

LocalBuilder loc = il.DeclareLocal(typeof(Foo)); 
    il.Emit(OpCodes.Stloc, loc); // store and pop topmost stack item 
    // work with (pop) previous stack item 
    il.Emit(OpCodes.Ldloc, loc); // push old topmost stack item 

Có một con đường mà không cần các địa phương rõ ràng?

Trả lời

7

Tôi không nghĩ vậy. Trong IL không có bất kỳ hướng dẫn như trao đổi mà sẽ cho phép bạn làm những gì bạn muốn. Tại sao bạn thấy sử dụng một địa phương như là phản đối? Nếu trình biên dịch JIT đủ tốt, điều này sẽ không dẫn đến bất kỳ mã máy nào chậm hơn so với sử dụng một phép hoán đổi giả định trong IL.

+1

Đối với "lý do" - đây là mã được tạo ra sẽ phải giới thiệu nhiều người dân địa phương mà tôi muốn. Nếu tôi có thể sử dụng phần trên cùng của ngăn xếp thay vào đó, tôi có thể tiết kiệm một lượng không gian ngăn xếp không đáng kể (người dân địa phương được dành riêng bất kể việc sử dụng, AFAIK). –

1
+0

Tác giả lập trình có suy nghĩ tương tự với tôi, sau đó. SWAP hoặc OVER sẽ thực hiện công việc ;-p Tôi sẽ phải kiểm tra máy ảo 4.0 của mình, nhưng tôi không hy vọng rằng nó khác biệt ở đó ... –

1

Inline với những gì kvb nói, bạn có thể thử một chức năng nhỏ để làm một số sắp xếp lại. Không chắc nó có nhanh hơn không.

+0

Ý nghĩ tốt, nhưng gần như chắc chắn là không; ngay cả khi JUT đã vạch ra nó. –

1

Tôi đã gặp phải sự cố tương tự này. Tôi muốn tạo ra một phương pháp khá lớn và tôi thường muốn 'hoán đổi' để lưu trữ một giá trị được tính toán. Tôi đã không hài lòng với số lượng lớn người dân địa phương xuất hiện trong ildasm và nhận thấy rằng BeginScope/EndScope không phải là bất kỳ sự giúp đỡ nào. Tôi vết thương tạo ra một 'trao đổi' địa phương cho bối cảnh của phương pháp của tôi và tái sử dụng nó cho mỗi hoạt động trao đổi. Nó làm cho IL sạch hơn; không chắc chắn nếu nó có bất kỳ tác động có ý nghĩa về hiệu suất.

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