Setting array length to 0 discards reserved allocation?

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Mon Jul 28 18:35:50 PDT 2014


On Monday, 28 July 2014 at 22:29:04 UTC, Ali Çehreli wrote:
> On 07/27/2014 01:49 AM, Jonathan M Davis wrote:
> > difference between a dynamic array and a slice (there really
> isn't any).
>
> At the risk of beating this never-dying horse, when you say 
> that, I don't think you can explain the following code:
>
>     int[] a = [ 1, 2, 3 ];
>     int[] b = a;
>
> According to your terminology, 'a' is a dynamic array and 'b' 
> is another dynamic array. Knowing how good you know D, I can't 
> understand how you think that way. In fact, both 'a' and 'b' 
> are slices into the single dynamic array. The dynamic array is 
> managed by the GC. So, there are three entities in that code: 
> One dynamic array and two slices.

It's simple, D's dynamic arrays _never_ own their memory. It's 
owned by the GC, or it's a slice of a static array, or it points 
to a buffer that was malloc-ed, etc. The type T[] says _nothing_ 
about who or what owns the memory or what backs the array. 
Understanding how it works when they're generated by the GC is 
very helpful in determining when a dynamic array / slice is 
likely to be reallocated, but it's pretty irrelevant to the type 
itself.

In your example, both a and b are dynamic arrays which are slices 
of the same underlying block of memory. It's a and b which are 
the dynamic arrays, not the buffer. From the type system's 
perspective, this would be the same

int[3] z = [1, 2, 3];
int[] a = z;
int[] b = a;

a and by are still exactly the same type - dynamic arrays - and 
they will behave exactly the same save for the fact that due to 
the fact that they're now backed by a static array rather than 
the GC, their capacity is guaranteed to be 0, and it's unsafe for 
them to escape from the scope of z.

The underlying buffer for a GC-backed dynamic array isn't even a 
D array. It's a druntime-specific data structure which holds a 
buffer via pointer.

The array article does a great job of explaining a lot of the 
details about how D arrays work (especially those backed by the 
GC), but it got the terminology wrong, and I definitely think 
that it should be fixed.

- Jonathan M Davis


More information about the Digitalmars-d mailing list