GC BlkAttr clarification. Programming in D pages 671, 672. About GC

Brother Bill brotherbill at mail.com
Wed Sep 3 19:56:03 UTC 2025


It appears that D has multiple ways of determining which created 
objects are subject to GC.

For class instances, new creates a new class instance, returning 
a pointer to it.  While "alive", other pointers may also point to 
the class instance.  Once no pointers are pointing to this class 
instance, it may be garbage collected.

OOP languages such as Eiffel can keep track of pointers to class 
instances.  They then do a generational lookup or do a thorough 
mark and sweep.

C, C++ and D can play shenanigans with pointers, such as casting 
them to size_t, which hides them from the GC.

In addition, D provides several ways to allocate and free memory.

GC.calloc can allocate memory for a slice of MyClass instances.
The developer may run GC.free to free the allocated memory.
But GC may perform its own garbage collection of GC allocated 
memory blocks.

Let's look at each attribute:  (confirm if my analysis is right, 
otherwise correct)

FINALIZE - just before GC reclaims the memory, such as with 
GC.free,
            call destructors, aka finalizers.

NO_SCAN - There may be false positives regarding byte values that 
look like 'new'
           allocated pointers.  This can result in 'garbage' 
memory not being collected.
           If we are CERTAIN that this memory block doesn't 
contain any pointers to
           'new' SomeClass allocated memory, then mark as NO_SCAN.

           Question 1: if GC-calloc has allocated MyClass that has 
a string 'name' member,
           which may expand in size, would be still properly apply 
NO_SCAN.

           Question 2: if GC-calloc has allocated MyClass, which 
may allocate
           new MyStudent(...), would that mean 'don't apply 
NO_SCAN'?

NO_MOVE - For GC.realloc, if increasing memory allocated, and 
it's not available,
           throw 'MEMORY_NOT_AVAILABLE' exception.

APPENDABLE - For D internal runtime use.  Don't mark this 
yourself.

NO_INTERIOR - This says that only the base address of the block 
may be a target address
               of other GC allocated pointers.
               All other possible pointers are 'false' pointers.

               Question 3: How is this different that NO_SCAN.

Perhaps I am missing the fundamentals of various D garbage 
collectors.

Are there any articles that expound on this issue?





More information about the Digitalmars-d-learn mailing list