2013-07-30 11 views
9

Attualmente ho un allineamento TCubeUn array può essere troppo grande?

CreateCube : array[1..1000] of tcube; 

Attualmente li utilizzano come una mappa in modo si potrebbe avere 30 cubetti di larghezza, altezza 20 cubetti, rendendo così un grande griglia. Ma 1000 cubi non sono sufficienti per quello di cui ho bisogno, ho bisogno di più di 10.000 cubi.

Un array di queste dimensioni causerà problemi lungo la strada? Altre opzioni?

+1

non è un problema a meno che non si disponga di memoria sufficiente – Sergio

+0

Quindi, in questo caso, i 1000 cubi vengono creati in fase di runtime, quindi quando li creo si utilizza più memoria? o definendo l'array, è tutto pronto a creare il cubo e sto solo modificando la memoria quando creo CreateCube [i]: = tcube.Create (self); –

risposta

16

Esistono due scenari principali in cui grandi array sono problematici:

  1. L'array è così grande che non si adatta in un blocco di memoria contiguo. Se la matrice contiene riferimenti anziché valori, è possibile che disponga di memoria sufficiente per l'array, ma di memoria insufficiente per gli oggetti a cui viene fatto riferimento.
  2. L'array è dichiarato come variabile locale e conduce a un overflow dello stack. Il modo in cui eviti questo problema è spostare l'array sull'heap. In Delphi, il modo più semplice per farlo è rendere l'array una matrice dinamica. Anche se si conoscono le dimensioni al momento della compilazione, è possibile utilizzare una matrice dinamica per spostare la memoria dallo stack e nell'heap.
5

Una matrice può essere grande quanto la memoria lo consente. Ma se è una variabile locale, o se la passi per il valore con un metodo, fai attenzione, puoi facilmente uscire dallo stack.

2

Scegliere la struttura dati corretta è qualcosa su cui posso solo consigliarti. Gran parte dipenderà da quanto popolato sarà l'array. Un array sparse potrebbe funzionare correttamente se l'array è grande ma popolato leggermente.

Personalmente, eseguivo la codifica di una classe elenco personalizzata per contenere istanze TCube. Questo ha diversi vantaggi su un array. In primo luogo, consumerà la memoria in modo dinamico. In secondo luogo, è possibile aggiungere ulteriori metodi a questa classe per adattarsi alle proprie applicazioni.