Does the GC consider slice lengths?

Steven Schveighoffer schveiguy at gmail.com
Fri Apr 1 20:55:05 UTC 2022


On 4/1/22 4:15 PM, Ali Çehreli wrote:
> On 4/1/22 10:46, Steven Schveighoffer wrote:
> 
>  >> But if
>  >> it considers slices and their lengths specially, then it would see
>  >> that the mid section is not referenced any more.
>  >
>  > It's not a consideration for the GC, but possibly the compiler. The GC
>  > has no visibility into slices that hold references to its memory block.
>  > It only has knowledge of pointers to its memory block (and then only
>  > indirectly via scanning).
> 
> Yes but if it recognized slices in addition to pointers, it could 
> consider their lengths to reuse the middle section, no? I understand the 
> role of the compiler but as GC is part of the D runtime, it feels like 
> it could own the concept of slices.

While *possible*, there are several problems:

1. The GC is performant (!) because it only has to check whether a block 
is live or not. If it had to also mark every single element (which is 
based on the type) of the block as live or dead, the performance takes a 
steep nosedive, along with space usage (1 bit per element?).
2. The GC somehow would have to manage that "middle" block of memory. 
How do you free part of a block?
3. By default, memory is untyped. I think even with precise scanning, 
the stack is untyped. The GC only scans pointers because it has no way 
of interpreting the length that's contained somewhere nearby. A lot of 
machinery would have to be added to make this happen.

> 
>  >> A related question is whether the memory for earlier elements are
>  >> freed as they are popped off from the front. I know by experience that
>  >> the memory for earlier elements are indeed freed. So one can use D's
>  >> arrays as queues without memory issues: Add to the end, pop from the
>  >> front...
>  >
>  > No, because removing the reference does not mean there are no other
>  > references.
> 
> Agreed but if the array is a private queue of a struct with just one 
> reference, then the earlier memory would be freed.
> 
> However, my mind was not working well in the morning: Combining with 
> what you said above, of course it is never the "previous parts" of the 
> array that are freed, rather the old allocations of the array that are 
> freed. (Provided there are no references.)

Yes, I didn't read fully your question. The "front" elements that you 
see freed are the old copies that are discarded when a reallocation 
occurs. It's still an entire block that's managed, not portions of it.

-Steve


More information about the Digitalmars-d-learn mailing list