2013-07-11 12 views
6

W Delphi można uzyskać rozmiar typu wartości za pomocą funkcji magicznej kompilatora sizeof(), ale wywołanie sizeof() na typie referencyjnym daje rozmiar wskaźnika, a nie wartości, na którą wskazuje.Jak uzyskać rozmiar pamięci tablicy dynamicznej?

Dla obiektów można uzyskać rozmiar pamięci za pomocą metody InstanceSize, ale co z dynamicznymi tablicami? Ze względu na wypełnienie, length(MyArray) * sizeof(element) może nie być dokładne. Czy istnieje jakiś dokładny sposób na uzyskanie rozmiaru pamięci dynamicznej tablicy?

+1

Minęło trochę czasu odkąd wykonałem obliczenia wskaźnikowe w Delphi, ale co z tego: 'PChar (@MyArray [last + 1]) - PChar (@MyArray [0])'? Oczywiście, 'last + 1' może spowodować, że indeks wyjdzie poza granice wyjątku, więc możesz chcieć użyć' last' zamiast tego i obliczyć * prawdziwy * rozmiar (dopełnienie i wszystko) każdego elementu i dodać to do niego. –

+0

Nie jestem pewien, czy w kompilatorze Borland istnieje dopełnienie elementu tablicy. – OnTheFly

+3

[Nie ma dopełnienia] (http://stackoverflow.com/questions/4583985/are-there-any-difference-between-array-and-packed-array-in-delphi). Możesz użyć 'Length (MyArray) * SizeOf (Element)'. –

Odpowiedz

5

Pomiędzy elementami tablicy dynamicznej nie ma dopełnienia, Length(MyArray)*SizeOf(Element) powinna być dokładna.

4

Rzeczywiście, length(MyArray) * sizeof(element) będzie dokładne dla zawartości tablicy z wyłączeniem dowolnej wewnętrznej dynamicznej tablicy lub łańcucha.

Jeśli chcesz użyć całej pamięci używanej w całej macierzy, , w tym zagnieżdżonych typów referencyjnych o rozmiarze treści, możesz użyć naszego opakowania TDynArray. Jest w stanie szeregować na binarne dowolne dynamiczne tablice, w tym zliczane liczone elementy (jak dynamiczne tablice lub łańcuchy). Masz do tego celu metody SaveTo/SaveToStream i możesz uzyskać rzeczywisty rozmiar całej zawartości.

Spójrz na at this blog article, który przedstawia to opakowanie. Jest to open source i działa od Delphi 5 do XE4, zarówno na platformach Win32 i Win64.

Powiązane problemy