È possibile modificare rapidamente un array dichiarato nello stack in uno dichiarato nell'heap

1

Ho circa 5000 righe di codice che manipolano un grande array in C ++. Il problema è che quando provo a rendere l'array ancora più grande, ad esempio un [10000] [10000], il compilatore gcc mi lancia un errore di errore di segmentazione.

Credo che la soluzione sia di cambiare l'array in un array dinamico. È possibile farlo cambiando solo la dichiarazione della variabile dell'array? O dovrei cambiare la modalità di accesso alla memoria?

Ad esempio,

Ho:

int A[10000][10000];    //rest of the code

Posso cambiarlo direttamente in:

int** A = new int*[size of input];      //rest of the code

lasciando intatto il resto del codice?

Grazie

    
posta Aåkon 13.12.2014 - 02:56
fonte

1 risposta

0

Il tuo suggerimento non è corretto.

int A[x][y];

(dove 'x' e 'y' sono espressioni che possono essere valutate a una costante in fase di compilazione) dichiara un singolo blocco di memoria che è x y sizeof (int) byte lungo, e A [i] [j] è tradotto in un riferimento al valore I * y + jth nel blocco. D'altra parte,

int ** A = new int * [x];

alloca una matrice di puntatori x a int arrays di dimensioni sconosciute e non inizializza quei puntatori per puntare a qualcosa di specifico. Ci sono due conseguenze a questo:

  1. Prima di poter utilizzare l'array dovrai anche allocare un blocco per ogni riga e archiviarlo nell'array di puntatori di primo livello, e

    1. mentre non è necessario modificare la sintassi che si sta utilizzando per accedere all'array (A [i] [j] funzionerà ancora), tenere presente che il codice generato dal compilatore deve caricare un puntatore dall'alto livello array e quindi preforma l'aritmetica su quello per trovare la posizione dell'elemento, che è meno efficiente.

Dovresti anche, come menzionato nei commenti, assicurarti di eliminare tutto ciò che crei. Tieni presente che l'eliminazione degli array in c ++ richiede l'uso di "cancella []" piuttosto che l'eliminazione ordinaria.

Dato che stai lavorando in c ++, ti consiglio di prendere in considerazione l'utilizzo dell'STL "array < >" digita se conosci la dimensione degli array in fase di compilazione:

unique_ptr<array<array<int,y>,x> > pA(new array <array <int, y>, x> >);
auto &A = *pA;

dovrebbe consentire di utilizzare la stessa sintassi a cui sei abituato, allocare tutta la memoria in un singolo blocco sullo heap, quindi utilizzarlo è efficiente come il tuo codice originale e occuparti di eliminarlo automaticamente quando è ora fuori ambito.

    
risposta data 13.12.2014 - 10:09
fonte

Leggi altre domande sui tag