Oppure

Loading
11/02/10 11:55
lorenzo
Mi è venuto un dubbio....

Istanziare una matrice del tipo:
  unsigned int **mat = new unsigned int*[65000];
  for(i = 0; i < 65000; i++)
      mat[i] = new unsigned int[65000];

è differente(come memoria allocata, posizione dati, allocazione in caso di poca memoria disponibile) da:
  unsigned int *mat = new unsigned int[65000*65000];

??
Ultima modifica effettuata da lorenzo 11/02/10 12:16
aaa
11/02/10 12:35
nessuno
Ovviamente tutti e due i casi sono improponibili perchè dovresti allocare una quantità enorme di memoria, ma dato che sono due esempi, allora :

nel primo caso allochi lo spazio per ogni elemento della tua matrice + lo spazio per i puntatori per ogni riga ... Quindi, se parliamo di sistemi a 32 bit :

65000 puntatori per le righe = 65000 * 4 = 260000 byte
+
65000 righe per 65000 interi = 65000 * 65000 * 4 = circa 19,2 G

Nel secondo caso, sempre per sistemi a 32 bit

65000 righe per 65000 interi = 65000 * 65000 * 4 = circa 19,2 G

Ma mentre nel primo caso il più grande blocco di memoria contigua necessario è quello occupato da ogni riga (65000 interi = 260000 byte), nel secondo caso si rende necessaria la disponibilità di memoria contigua per tutto lo spazio della matrice ...

Nel secondo caso, se l'allocazione ha successo, avrai la memoria contigua adatta ad operazioni "veloci" di riempimento, ricerca; nel primo, dovrai operare come se le righe in memoria non fossero contigue.
Ultima modifica effettuata da nessuno 11/02/10 12:36
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
11/02/10 20:07
lorenzo
proprio come pensavo, grazie

aaa