VC++: stack overflow con un array da meno di 4MB in stack?:\
Inviato: mercoledì 29 febbraio 2012, 22:55
Piccolo esempio con l'algoritmo di Kadane (che il massimo sottovettore): in input prendo un array letto da un semplice file testuale che può arrivare fino ad un milione di interi.
sia su linux che su windows gli int sono da 4 byte, ergo l'array è grande 4 milioni di byte, circa 3.8.. MB
Ora non ditemi che è troppo per un sistema da 16GB dove tre quarti della memoria sono liberi
Da quel che ricordo costanti a parte, il C++ allocava tutto quello che è statico e automatico in stack, mentre tutto quello che è allocato dinamicamente in heap.
ebbene mi da stack overflow (almeno così dice il debugger) se provo ad allocare l'array come variabile automatica, ovvero in stack.
Se lo alloco staticamente (compreso come variabile globale) o dinamicamente l'array nessun problema.
Qua allego il codice:
O è Windows che ha una concezione dello stack e della heap tutto suo o sono io che ho avuto insegnamenti errati ( cosa da non scartare )
sia su linux che su windows gli int sono da 4 byte, ergo l'array è grande 4 milioni di byte, circa 3.8.. MB
Ora non ditemi che è troppo per un sistema da 16GB dove tre quarti della memoria sono liberi
Da quel che ricordo costanti a parte, il C++ allocava tutto quello che è statico e automatico in stack, mentre tutto quello che è allocato dinamicamente in heap.
ebbene mi da stack overflow (almeno così dice il debugger) se provo ad allocare l'array come variabile automatica, ovvero in stack.
Se lo alloco staticamente (compreso come variabile globale) o dinamicamente l'array nessun problema.
Qua allego il codice:
Codice: Seleziona tutto
/*Data una sequenza di interi A[1..N], vogliamo scegliere una sottosequenza A[I..J] tale che la somma dei propri elementi sia massima fra tutte le sottosequenze. Quale ´e la massima somma che siamo in grado di ottenere? */
#include <fstream>
int maxSubArray( int myArray[ ], const int& dimension );
int main( )
{
int dimension = 0;
// int myArray[ 1000000 ];
std::ifstream inputFile("input.txt");
inputFile >> dimension;
int* myArray = new int[ dimension ];
for( int i = 0; i < dimension; i++ )
{
inputFile >> myArray[ i ];
}
inputFile.close( );
std::ofstream outputFile( "output.txt" );
outputFile << maxSubArray( myArray, dimension );
outputFile.close( );
return( 0 );
}
int maxSubArray( int myArray[ ], const int& dimension )
{
int maxValue = 0;
int currentValue = 0;
for( int i = 0; i < dimension; i++ )
{
if( ( currentValue + myArray[ i ] ) > 0 )
{
currentValue += myArray[ i];
}
else
{
currentValue = 0;
}
if( currentValue > maxValue )
{
maxValue = currentValue;
}
}
return( maxValue );
}