Saat Anda memanggil suatu fungsi, "ruang nama" baru dialokasikan di tumpukan. Begitulah fungsi dapat memiliki variabel lokal. Saat fungsi memanggil fungsi, yang pada gilirannya memanggil fungsi, kami terus mengalokasikan lebih banyak ruang di tumpukan untuk mempertahankan hierarki ruang nama yang dalam ini.
Untuk mengekang program yang menggunakan ruang tumpukan dalam jumlah besar, batasan biasanya diterapkan melalui ulimit -s
. Jika kami menghapus batas itu melalui ulimit -s unlimited
, program kami akan dapat terus melahap RAM untuk tumpukan yang terus tumbuh sampai akhirnya sistem kehabisan memori seluruhnya.
int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.
Biasanya, menggunakan satu ton ruang tumpukan tidak disengaja atau merupakan gejala rekursi yang sangat dalam yang mungkin seharusnya tidak terlalu bergantung pada tumpukan. Dengan demikian batas tumpukan.
Dampak terhadap kinerja kecil tetapi memang ada. Menggunakan time
perintah, saya menemukan bahwa menghilangkan batas tumpukan meningkatkan kinerja beberapa sepersekian detik (setidaknya pada Ubuntu 64bit).
ulimit -s unlimited
biarkan tumpukan tumbuh tanpa batas.
Hal ini dapat mencegah program Anda mogok jika Anda menulis program dengan rekursi, terutama jika program Anda bukan rekursif ekor (penyusun dapat "mengoptimalkannya"), dan kedalaman rekursi besar.
ukuran tumpukan bisa memang menjadi tidak terbatas. _STK_LIM
adalah default , _STK_LIM_MAX
adalah sesuatu yang berbeda untuk setiap arsitektur, seperti yang dapat dilihat dari include/asm-generic/resource.h
:
/*
* RLIMIT_STACK default maximum - some architectures override it:
*/
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX RLIM_INFINITY
#endif
Seperti dapat dilihat dari contoh ini, nilai generik tidak terbatas, di mana RLIM_INFINITY
adalah, sekali lagi, dalam kasus umum didefinisikan sebagai:
/*
* SuS says limits have to be unsigned.
* Which makes a ton more sense anyway.
*
* Some architectures override this (for compatibility reasons):
*/
#ifndef RLIM_INFINITY
# define RLIM_INFINITY (~0UL)
#endif
Jadi saya kira jawaban sebenarnya adalah - ukuran tumpukan BISA dibatasi oleh beberapa arsitektur, maka pelacakan tumpukan tidak terbatas akan berarti apa pun _STK_LIM_MAX
didefinisikan, dan jika tak terhingga - tak terhingga. Untuk detail tentang apa artinya menyetelnya menjadi tidak terbatas dan apa implikasinya, lihat jawaban lain, ini jauh lebih baik daripada jawaban saya.