On 04.04.2017 16:27, Ryan Joseph wrote: >>> Does SetLength on a single level dynamic array not even allocate a >>> continuous block of memory? >> >> Yes, it does (as explained in all the other mails). >> A (dynamic) array of integer will be allocated as a single block by >> SetLength. >> So if you only have one level of a dynamic array as in >> >> var MyArray : array of integer; >> >> then SetLength(MyArray,1000) will allocate a single block of 1000 integers. >> But with >> >> var MyArray : array of array of integer; >> >> SetLength(MyArray,1000); >> >> will allocate a single block of 1000 pointers (to an array of integer each). >> Then, SetLength(MyArray[0],1000) will allocate one (!) block of 1000 >> integers. >> SetLength(MyArray[1],1000) will allocate another block of 1000 integers and >> so on…. > > I was allocating using SetLength(MyArray, 3, 3, 3) for a 3x3x3 matrix for > example. Maybe it depends on the memory manager and the state of heap but if > you called early in the programs execution it should be allocate all that > memory in one block I would think.
Addendum: If you look at fpc_dynarray_setlength() again then you'll see at line 289 that it's calling itself recursively for nested arrays. Regards, Sven _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal