2010-01-10 28 views
8

Hãy tha thứ cho tôi nếu đây là một câu hỏi ngớ ngẩn nhưng tôi sợ rằng tôi không biết 'chồng' là gì.Điều gì, chính xác, là 'Ngăn xếp' vì nó liên quan đến .Net

Tôi biết 'ngăn xếp' là gì và tôi đã học được từ viết tắt FILO/FIFO. Nhưng khi mọi người nói những thứ như 'một loại giá trị được phân bổ trên ngăn xếp, không phải là đống' - Tôi sợ tôi không thực sự biết điều đó có nghĩa là gì.

Khi tôi giới thiệu lỗi logic vào hàm đệ quy - tôi không thể cấp thêm bộ nhớ cho 'ngăn xếp' và ứng dụng của tôi bị lỗi .... nhưng tôi không thực sự hiểu nó là gì.

Tôi đã cố gắng tìm câu trả lời của Google nhưng chỉ tìm thấy thông tin về 'ngăn xếp' và cách sử dụng.

Khi tôi chạy ứng dụng .Net - nó có tạo ra một 'ngăn xếp ngăn xếp' để hoạt động như 'Ngăn xếp' không? Tôi đã nhìn thấy dấu vết Stack cho tôi thấy mức độ thực thi của mã - thường xuyên nhất khi tôi gặp phải một ngoại lệ không được chấp nhận ... nhưng tất cả những gì tôi nhớ là có thể thấy là các phương thức và thứ tự chúng được gọi ... sẽ không ngăn xếp cũng có tất cả các biến trong phạm vi cho mỗi bước của ngăn xếp.

Có lẽ tôi chỉ là ngớ ngẩn - nhưng tôi nghĩ tôi có thể tưởng tượng một tình huống có chức năng đệ quy, sẽ thuận tiện để xem giá trị trước đó của biến - từ 'chồng' nhưng không cần phải vượt qua nó in.

Dunno nếu điều đó có ý nghĩa gì - nó quá muộn. Nhưng tôi thực sự sẽ đánh giá cao bất kỳ thông tin ai có.

+0

Khi bạn không thể phân bổ thêm bộ nhớ, tôi đoán đó là do có đệ quy vô hạn, có nghĩa là tại một số điểm, máy tính sẽ không có đủ bộ nhớ để tính toán đệ quy. –

+1

Cụm từ * "Một loại giá trị được phân bổ trên ngăn xếp" * không hoàn toàn chính xác. Xem ở đây để biết thêm thông tin: http://stackoverflow.com/questions/1130468/memory-allocation-of-value-types-and-reference-types-in-net-framework –

+0

BTW, cho "The Heap vs The Stack" , đây là một bản tóm tắt ngắn: http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html –

Trả lời

18

Cụm từ đó đề cập đến số call stack. Bạn có thể tìm hiểu thêm về các khái niệm trong một chương trình cấp thấp hoặc kiến ​​trúc máy tính/tổ chức khóa học, là bạn để có một.

Bất cứ khi nào hàm được gọi, địa chỉ trả về (nơi được gọi), cũng như tham số cho hàm, được đẩy lên "ngăn xếp" (ngăn xếp trong bộ nhớ, nhưng không, không phải là dữ liệu ngăn xếp C# cấu trúc mà bạn đã đọc về trên MSDN). Khi một hàm kết thúc, địa chỉ được bật ra từ ngăn xếp và kiểm soát sẽ tiếp tục tại vị trí ban đầu (tại địa chỉ xuất hiện). Các bó thông tin liên quan đến một cuộc gọi hàm (các biến địa phương, địa chỉ trả về, các tham số, vv) được gọi là "khung ngăn xếp". Vì vậy, khi bạn sử dụng đệ quy (và nó bị bắt trong một vòng lặp đệ quy vô hạn), bạn chỉ cần điền vào chồng lên với địa chỉ trả về (và các dữ liệu khác) cho đến khi không còn chỗ trống.

Chỉnh sửa - Bạn cũng đã đề cập đến the heap. Đây là nơi các cấu trúc dữ liệu được lưu trữ (cấp phát bộ nhớ động, thông qua từ khóa new trong hầu hết các ngôn ngữ trong những ngày này, hoặc malloc trong C). Ví dụ, trong C/C++, dữ liệu trên heap ở đó cho đến khi nó được giải phóng một cách rõ ràng. Điều này là để được tương phản với các biến địa phương/tự động được lưu trữ trên ngăn xếp (và do đó bị phá hủy khi phạm vi của họ chấm dứt ... họ đang popped tắt ngăn xếp ra khỏi sự tồn tại).

+0

Có, tôi đánh giá cao việc có những khoảng trống trong kiến ​​thức của tôi đã bị xóa. :) – Sapph

+0

Hoặc ít nhất đặt 2x4 lên chúng .... –

+0

Rất hữu ích. Cảm ơn bạn –

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