2012-05-13 27 views
5

Chúng ta đều biết rằng thực hành tốt để tạo ra các phương pháp nhỏ thúc đẩy tái sử dụng, chắc chắn sẽ gây ra rất nhiều phương pháp được đặt trên ngăn xếp. Tuy nhiên, nó có thể đạt được kịch bản mà có rất nhiều phương pháp lồng nhau gọi là một ngoại lệ StackOverflow xảy ra?Có thể có quá nhiều phương pháp về kích thước ngăn xếp và tràn có thể không?

Giải pháp được chấp nhận có đơn giản là tăng kích thước ngăn xếp không?

documentation states rằng một ngoại lệ như vậy sẽ xảy ra trong "đệ quy rất sâu hoặc không bị ràng buộc" để có thể chắc chắn là có thể hoặc khuôn khổ .NET tự động xử lý kích thước ngăn xếp cho chúng ta?

Câu hỏi của tôi có thể tóm tắt như sau:

Có thể có một chương trình được thiết kế tốt như vậy (trong về phương pháp tái sử dụng nhỏ) mà là trở nên necassary để tăng kích thước chồng và do đó sử dụng nhiều tài nguyên hơn?

Trả lời

2

Không thực sự. Tôi chỉ làm một thử nghiệm rất nhanh, và một StackOverflowException xảy ra sau 15.000 cuộc gọi lồng nhau.

Không có cách nào bạn sẽ viết mã sẽ không đệ quy tổ 15.000 lần do số lượng tuyệt đối của các phương pháp bạn có.

Rõ ràng số chính xác phụ thuộc vào nhiều biến chức năng cục bộ mà bạn đã cấp phát trên ngăn xếp. Nhưng bất kể số lượng thực tế đó có thể là bao nhiêu thì nó không đủ gần để làm những gì bạn đang đề xuất.

3

Kích thước ngăn xếp .NET được cố định và 1 MB theo mặc định.

Có thể có một chương trình được thiết kế tốt (về các phương pháp tái sử dụng nhỏ) có cần thiết để tăng kích thước ngăn xếp và do đó sử dụng nhiều tài nguyên hơn không?

Nó sẽ không nằm trong quá trình phân tách logic của bạn thành các phương pháp.

Cách duy nhất bạn sẽ gặp phải tình trạng tràn ngăn xếp không phải là lỗi trực tiếp là đệ quy. Và khi điều đó xảy ra (đe dọa), đừng tăng ngăn xếp nhưng viết lại mã để sử dụng một cách khác để lưu trữ dữ liệu (như là Stack<T>).

0

Trong thế giới được quản lý, ngăn xếp có vai trò đặc biệt đối với hiệu suất. Nếu bạn quản lý để phân bổ một cái gì đó trên ngăn xếp (bằng cách sử dụng nguyên thủy hoặc cấu trúc), bạn không cần phải đặt nó trên heap. Phân bổ trên heap thêm áp lực GC mà trên trung bình làm chậm chương trình.

Vì vậy, tôi có thể hình ảnh một chương trình nhanh hơn bằng cách phân bổ nhiều nội dung trên ngăn xếp. Thậm chí sử dụng stackalloc (đó là một tính năng ít được biết đến của C#/CLR).

Có các trường hợp hợp lệ để thực hiện việc này. Họ rất hiếm. Chỉ cần nói "không có sử dụng hợp lệ" là đồng bằng sai.

+0

Bạn có chắc là bạn đang trả lời đúng câu hỏi? –

+0

@ MahmoudAl-Qudsi - Tôi đồng ý, đây không phải là những gì tôi đã hỏi –

+0

@ m.edmondson, bạn có thể xây dựng trên những gì bạn muốn biết không? Tôi đã trả lời câu hỏi mà bạn đã đặt ra trong đoạn cuối: Có các lý do hợp lệ để lập trình theo cách yêu cầu tăng kích thước ngăn xếp hay không. Tôi đã đưa ra lý do cho điều đó.Tôi có hiểu lầm điều gì đó không? – usr