Does the GC consider slice lengths?

Steven Schveighoffer schveiguy at gmail.com
Fri Apr 1 17:46:20 UTC 2022


On 4/1/22 12:24 PM, Ali Çehreli wrote:
> void main() {
>    auto a = new int[1_000_000];
> 
>    auto b = a[0..1];  // Hold on to the first element
> 
>    a = a[$-1..$];     // Drop all but the last element
> 
>    // Are the middle elements gone, or is b keeping
>    // them alive just because it still holds the very
>    // first pointer?
> 
>    // Attempt to access original elements through
>    // a pointer to the first element. Bug?
>    auto c = b.ptr[0..1_000_000];

Not a bug, the array still exists and is allocated (the pointer is 
keeping it alive). Remember, the GC manages the memory, not the slice.

e.g. if this were an array of structs with destructors, those 
destructors would not be called just because they aren't referenced by 
some slice.

> }
> 
> One assumption might be that the GC remembers the single large 
> allocation as one and all of the elements are still available? 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).

Only the compiler could consider this distinction. As of yet, I don't 
think D has stated one way or another whether this could be exploited.

But thinking about how a non-native array type might be implemented, I 
don't think there's any possible way D could consider a reference to one 
element to not be a reference to *all* elements.

> 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.

-Steve


More information about the Digitalmars-d-learn mailing list