2013-07-11 12 views
6

In Delphi, è possibile ottenere le dimensioni di un tipo di valore con la funzione magica del compilatore sizeof(), ma chiamando sizeof() su un tipo di riferimento si otterrà la dimensione di un puntatore, non del valore a cui punta.Come ottenere le dimensioni della memoria di un array dinamico?

Per gli oggetti, è possibile ottenere le dimensioni della memoria con il metodo InstanceSize, ma per quanto riguarda gli array dinamici? A causa del riempimento, length(MyArray) * sizeof(element) potrebbe non essere preciso. Quindi, esiste un modo preciso per ottenere le dimensioni della memoria di un array dinamico?

+1

È passato un po 'di tempo da quando ho eseguito i calcoli del puntatore in Delphi, ma che dire di questo: 'PChar (@MyArray [last + 1]) - PChar (@MyArray [0])'? Naturalmente, 'last + 1' potrebbe causare un'eccezione di indice fuori dai limiti, quindi potresti voler usare' last' invece e calcolare la dimensione * real * (padding e tutti) di ogni elemento e aggiungerla ad essa. –

+0

Non sono sicuro se ci sia un riempimento di elementi dell'array nel mondo dei compilatori di Borland. – OnTheFly

+3

[Non c'è padding] (http://stackoverflow.com/questions/4583985/are-there-any-difference-between-array-and-packed-array-in-delphi). Puoi usare 'Length (MyArray) * SizeOf (Element)'. –

risposta

5

Tra gli elementi di un array dinamico non c'è riempimento, Length(MyArray)*SizeOf(Element) deve essere accurato.

4

Infatti, length(MyArray) * sizeof(element) sarà accurato per il contenuto dell'array escluso qualsiasi array o stringa dinamica interna.

Se si desidera che l'intero array utilizzi la memoria, compresi i tipi di riferimento annidati, dimensione del contenuto, è possibile utilizzare il wrapper TDynArray. È in grado di serializzare in binario qualsiasi array dinamico, inclusi i membri con riferimenti di riferimento (come array dinamici o stringhe). Hai a disposizione i metodi SaveTo/SaveToStream e sei in grado di ottenere la dimensione effettiva di tutti i contenuti.

Dai uno sguardo allo at this blog article, che presenta questo involucro. È open source e funziona da Delphi 5 fino a XE4, in entrambe le piattaforme Win32 e Win64.

Problemi correlati