2012-12-22 34 views
5

Tôi muốn thông tin chính xác về ngăn xếp tràn trong VC++ (32 bit và 64 bit), và đặc biệt trong đệ quy. Trong chế độ Debug, điều này xảy ra quá sớm trong đệ quy (như 4500 chạy của một hàm đệ quy đơn giản không làm bất cứ điều gì hoặc như thế). Tuy nhiên, có vẻ như chế độ phát hành là khác nhau. Thật khó hiểu, và bây giờ tôi không thử nghiệm, vì tối ưu hóa xóa mã không làm gì cả (dường như loại bỏ đệ quy), vì mã hoặc hàm của tôi là như vậy .. Tôi nên làm nhiều hơn .. Tôi đo đúng thời điểm trong bản phát hành được tối ưu hóa, tôi không biết liệu tối ưu hóa có giống nhau trong sắp xếp nhanh chóng phức tạp hơn được thực hiện bởi đệ quy không?kích thước của ngăn xếp trong VC++ là gì?

Cảm ơn!

Trả lời

7

Như Andreas Brinck states in his related answer:

Trong VC++ kích thước ngăn xếp mặc định là 1 MB tôi nghĩ rằng, như vậy với một đệ quy độ sâu 10.000 mỗi stack frame có thể tối đa là ~ 100 byte.

kích thước giới hạn ngăn xếp này có thể được sửa đổi bằng:

Project → Properties → Configuration Properties → Linker → Hệ thống → stack trữ Kích.

Project → Properties → Configuration Properties → Linker → System → Stack Reserve Size.

+0

hoạt động, cảm ơn, nó cần xây dựng lại sau khi định cấu hình. Cảm ơn! – user683595

+0

Bạn được chào đón !! Đừng quên chấp nhận câu trả lời. Giáng sinh vui vẻ!! –

+0

Đoạn đầu tiên được sao chép nguyên văn từ [kích thước ngăn xếp tối đa C/C++] (http://stackoverflow.com/q/1825964) –

0

Bạn có thể làm tất cả các thuật toán đệ quy ví dụ lặp đi lặp lại với một ngăn xếp riêng biệt.

1

Các tùy chọn cho stack kích thước trong VC++ tọa lạc tại,

Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size. 
0

Trong khi tăng chồng không phải là một ý tưởng khủng khiếp, stackspace không phải là vô hạn, và như bạn đã có thể nhận thấy, chạy ra khỏi ngăn xếp không dễ dàng phục hồi. Nếu bạn PHẢI sử dụng các hàm đệ quy để recurse vài nghìn mức, thì bằng mọi cách tăng stack.

Để đảm bảo an toàn, hãy kiểm tra mức đệ quy an toàn tối đa và sau đó có giới hạn chức năng của bạn [ngay cả trong mã sản xuất, ngay cả khi nó chậm hơn một chút và có thể chiếm nhiều không gian hơn] . Nếu không, bạn có thể đặt cược rằng ai đó, ở đâu đó, sẽ sử dụng mã của bạn theo cách bạn không lường trước được, và có một sự cố khi nó chạy một vài cấp độ sâu hơn vào đệ quy hơn bạn dự đoán - kablam, không thể phục hồi.

Một giải pháp khả thi khác là chạy đệ quy của bạn trong một chuỗi riêng biệt và nếu chuỗi đó bị treo, bạn vẫn có luồng chính để khôi phục từ sự cố theo cách sane (nếu không có gì khác, chỉ cần ghi lại thực tế là mã bị lỗi với một ngăn xếp không thành công, và hoàn cảnh đó là gì).

Tôi chắc chắn muốn có mức đệ quy không hạn chế hoặc ít nhất, và sử dụng các cơ chế khác, chẳng hạn như cấu trúc dữ liệu lifo được phân bổ động để ghi lại "chúng ta đang ở đâu".