Co zadeklarowane przeze mnie ląduje na stosie a co nie?
Wszystko zadeklarowane w funkcji, co nie alokuje pamięci dynamicznie.
Mógłby ktoś napisać coś o tym, albo podesłać jakiś link bo nie rozumiem jak to działa
https://en.wikipedia.org/wiki/Stack-based_memory_allocation
https://pl.wikipedia.org/wiki/Stos_(informatyka)#Stos_procesora
int a[MILION], b[MILION], c[MILION]; // nie powoduje przepelnienia
Na oko: bo kompilator jest sprytny i zauważył że te tablice nie są używane, więc skleił je w jedną tablicę o rozmiarze miliona. Jak wziąłem adresy tych tablic (co zmusiło kompilator do stworzenia osobnych tablic), to dostałem przepełnienie.
int a[MILION], b[MILION], c[MILION];
auto ptr = &a; ptr = &b; ptr = &c;
13:26 $ g++ -g main.cpp && ./a.out
Segmentation fault (core dumped)
A to:
vector<int> vec(MILION * 69);
Po prostu dlatego, że vector alokuje pamięć normalnie na stercie, a na stosie dochodzi tylko kilkanaście bajtów na wskaźniki z których składa się vector.