Dikutip dari MSDN tentang StackOverflowException :
Pengecualian yang dilemparkan ketika tumpukan eksekusi melimpah karena mengandung terlalu banyak panggilan metode bersarang.
Too many
cukup samar di sini. Bagaimana saya tahu kalau terlalu banyak benar-benar terlalu banyak? Ribuan panggilan fungsi? Jutaan? Saya berasumsi bahwa itu harus dikaitkan dengan beberapa cara dengan jumlah memori di komputer tetapi apakah mungkin untuk menghasilkan urutan besarnya kira-kira akurat?
Saya khawatir tentang ini karena saya mengembangkan sebuah proyek yang melibatkan banyak penggunaan struktur rekursif dan panggilan fungsi rekursif. Saya tidak ingin aplikasi gagal ketika saya mulai menggunakannya untuk lebih dari sekedar tes kecil.
.net
exceptions
recursion
stackoverflow
marco-fiset
sumber
sumber
Stack<T>
.editbin /stack:WHATEVER-NUMBER-YOU-LIKE yourexefile.exe
.Jawaban:
Kecuali jika lingkungan bahasa Anda mendukung pengoptimalan panggilan ekor (dan rekursi Anda adalah panggilan ekor), aturan dasar praktisnya adalah: kedalaman rekursi harus dijamin menjadi O (log n), yaitu menggunakan algoritme atau struktur data berdasarkan pembagian-dan- menaklukkan (seperti pohon, alogoritma penyortiran paling, dll) adalah OK, tapi apa pun linier (seperti implementasi rekursif penanganan daftar terkait) tidak.
sumber
Secara default, CLR mengalokasikan 1 MB ke stack untuk setiap utas (lihat artikel ini ). Jadi, bagaimanapun banyak panggilan yang diperlukan untuk melebihi jumlah ini. Itu akan bervariasi tergantung pada seberapa banyak ruang pada stack yang digunakan setiap panggilan untuk hal-hal seperti parameter dan variabel lokal.
Anda bahkan dapat membuatnya melempar
StackOverflowException
dengan satu panggilan jika Anda ingin menjadi sedikit tidak ortodoks:sumber
Karena Cole Campbell mencatat ukuran memori dan Michael Borgwardt mencatat optimasi panggilan ekor, saya tidak akan membahasnya.
Hal lain yang perlu diperhatikan adalah CPS yang dapat digunakan untuk mengoptimalkan beberapa fungsi terjalin di mana optimasi panggilan ekor adalah untuk fungsi tunggal.
Anda dapat meningkatkan ukuran tumpukan seperti yang kami lakukan di sini , dan perhatikan bahwa kode 64-bit memakan tumpukan lebih cepat dari kode 32-bit.
Yang perlu diperhatikan adalah bahwa kami menjalankan salah satu contoh di bawah F # interaktif selama lebih dari 40 jam tanpa meniup tumpukan. Ya itu adalah salah satu panggilan fungsi yang berjalan dengan sendirinya terus menerus hingga berhasil diselesaikan.
Juga, jika Anda perlu melakukan cakupan kode untuk mencari tahu di mana masalah terjadi dan tidak memiliki cakupan kode dengan VS yang dapat Anda gunakan, TestDriven.NET
sumber