Ответ
По умолчанию в большинстве дистрибутивов Linux размер стека основного потока процесса составляет 8 МБ. Это значение можно проверить и изменить.
Практическая проверка:
- Командой в терминале:
ulimit -s(покажет размер в килобайтах). - Программно на C++:
#include <iostream>
#include <sys/resource.h>
int main() {
rlimit limit;
if (getrlimit(RLIMIT_STACK, &limit) == 0) {
std::cout << "Soft stack limit: " << limit.rlim_cur / 1024 / 1024 << " MBn";
std::cout << "Hard stack limit: " << limit.rlim_max / 1024 / 1024 << " MBn";
}
return 0;
}
Важные нюансы из опыта:
- Для потоков, создаваемых
std::threadилиpthread_create, размер стека по умолчанию обычно берётся из атрибутов потока и может отличаться (часто 2-8 МБ). Его можно задать явно. - При работе с рекурсивными алгоритмами или большими локальными массивами (
int buffer[100000]) легко получить переполнение стека. В таких случаях я либо выделяю память в куче (черезstd::vector), либо увеличиваю лимит с помощьюpthread_attr_setstacksize. - В embedded-системах этот лимит часто значительно меньше (порядка десятков или сотен килобайт).