2014-12-15 13 views
19

Próbowałem już programu poniżej. Intencją tego programu jest wykrycie więcej informacji o rozmiarach stosów.Maksymalny rozmiar stosu w programie C/C +?

int main() 
{ 
    int nStack[100000000]; 
    return 0; 
} 

Po wykonaniu powyższego kodu, program ulega awarii z powodu ogromnej alokacji wielkości stosu. Jaki jest maksymalny możliwy rozmiar stosu? Czy jest to ustalone dla każdego programu/komputera? Czy można go zwiększyć?

Chcę poznać ze względu na wiedzę. Jeśli ktokolwiek może dostarczyć przykłady w C/C++, byłby bardzo pomocny.

+0

Czy próbowałeś za pomocą tego? [getrlimit/setrlimit] (http://man7.org/linux/man-pages/man2/getrlimit.2.html) –

+0

Usuwanie '[java]', ponieważ pytanie nie wydaje się być powiązane. –

+1

Pthreads umożliwia dostarczenie własnego stosu dla nowych wątków.Można dynamicznie alokować dużą ilość pamięci, a następnie uruchomić wątek z tą pamięcią jako stosem. –

Odpowiedz

-1

Próbowałem poniżej programu.

int main() 
{ 
    int nStack[519492]; 
    cout<<"Okay!"; 
    return 0; 
} 

Wyjście:

Okay! 

Ale jeśli mogę zwiększyć rozmiar tablicy o 1 bajt, awarie programu.

int main() 
{ 
    int nStack[519493]; 
    cout<<"Okay!"; 
    return 0; 
} 

wyjściowa:

No output. Program crashes. 
18

Jaki jest maksymalny rozmiar stosu?

Zależy od wdrożenia. Jeden na kilka megabajtów jest obecnie typowy dla komputerów PC.

Czy jest to stałe dla każdego programu/komputera?

Zazwyczaj jest on ustawiony na łączenie, ale standard nie definiuje go. Niektóre systemy operacyjne mogą również ograniczać stos podczas uruchamiania (na przykład na przykład Linux).

Czy można go zwiększyć?

Może to być możliwe w zależności od implementacji. Zobacz dokumentację swojego linkera, aby uzyskać szczegółowe informacje. I prawdopodobnie także dokumentacja dla systemu operacyjnego i formatu wykonywalnego.

Powinieneś dynamicznie przydzielać ogromne tablice takie jak ta.

+0

w takim razie, skąd możemy wiedzieć, ile ilość żetonów nasz program zużyje ??? – pkthapa

+0

@PKThapa Ogólnie rzecz biorąc, nie jest to możliwe. W przypadku programów, które nie korzystają z rekurencji lub tablic o zmiennej długości, zwykle można założyć, że stos nie będzie zbyt duży. – fuz

+0

Właściwie jest to zazwyczaj naprawiane przez linker, a nie przez kompilator. –

7

W przypadku aplikacji opartych na systemie Linux możemy używać interfejsów API getrlimit i setrlimit do poznania różnych ograniczeń zasobów jądra, takich jak rozmiar pliku core, czas procesora, rozmiar stosu, ładne wartości, max. Nie. procesów itp. "RLIMIT_STACK" jest nazwą zasobu zdefiniowaną w jądrze Linux. Poniżej znajduje się prosty program do pobierania rozmiar stosu:

#include <iostream> 
#include <sys/time.h> 
#include <sys/resource.h> 
#include <errno.h> 
using namespace std; 

int main() 
{ 
    struct rlimit sl; 
    int returnVal = getrlimit(RLIMIT_STACK, &sl); 
    if (returnVal == -1) 
    { 
     cout << "Error. errno: " << errno << endl; 
    } 
    else if (returnVal == 0) 
    { 
     cout << "stackLimit soft - max : " << sl.rlim_cur << " - " << sl.rlim_max << endl; 
    } 
} 
-1

Aby zmienić rozmiar stosu przeznaczonej dla głównego wątku, który jest podniesiony przez loader procesowej, aby uruchomić kod na to jest punkt wejścia, poszukaj w dokumentacji łącznikową. Możliwa jest również edycja tego rozmiaru stosu w metadanych nagłówka wykonywalnego.

+0

Byłoby bardzo pomocne i pouczające, jeśli podzielisz się z nami informacjami o tym, jak edytować rozmiar stosu, jak to, co powiedziałeś powyżej. Nie mam o tym pojęcia. – pkthapa

Powiązane problemy