Setting array length to 0 discards reserved allocation?
Jonathan M Davis via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jul 29 03:02:44 PDT 2014
On Tue, 29 Jul 2014 02:54:37 -0700
Ali Çehreli via Digitalmars-d <digitalmars-d at puremagic.com> wrote:
> You don't say anything below that does not work when I replace
> "dynamic array"s with "slice"s. Let's see... (I mark every such
> replaced-by-me-"slice" with double stars.)
Because they're the same thing as far as D is concerned.
> On 07/28/2014 06:35 PM, Jonathan M Davis wrote:
>
> > 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 **slices** _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 **slice** / slice is likely to be reallocated,
> > but it's pretty irrelevant to the type itself.
> >
> > In your example, both a and b are **slices** which are slices of
> > the same underlying block of memory. It's a and b which are the
> > **slices**, 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 - **slices** - 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 **slice** 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
>
> The array article uses terminology that removes confusion.
It uses terminology that does not match the language spec. It could use
the correct terminology and still remove confusion.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list