Я думал, что знаю, что означает аргумент размера стека в beginthread. Итак, мой вопрос: почему это работает?
#include <iostream>
#include <process.h>
using namespace std;
void huge_stack(int a, int b, int c, int d)
{
int i[100000] = {0};
cout << a << b << c << d << i[12333] << endl;
}
bool done = false;
void thread(void* p)
{
huge_stack(1,2,3,4);
done = true;
}
int main()
{
_beginthread(thread, 10, nullptr);
while(!done) {}
return 0;
}
Я убедился, что я работаю в режиме отладки, поэтому вызовы и массивы не будут оптимизированы.
Размер резервного стека, как правило, довольно большой … примерно 1 МБ в Windows и 8 МБ в Linux. Обратите внимание, что это отличается от размера коммита, с которого он начинается, обычно что-то вроде 4KB. Стек автоматически увеличится до резервного размера. Также обратите внимание, что в 32-разрядных системах с большими резервными стеками вы можете довольно быстро исчерпать виртуальное адресное пространство с помощью нескольких сотен потоков (таким образом, вы можете изменить это при необходимости, используя свойства ссылок Windows или Linux ulimit). Наконец, для больших объектов я бы все равно рекомендовал использовать кучу.
Других решений пока нет …