On Saturday, 12 September 2015 at 06:25:45 UTC, NX wrote:
Is there even a compiler switch to disable GC altogether so the program doesn't have a GC thread? No, I can't see it...

D programs *never* have a GC thread.

The way the D garbage collector works is something like this:

void* GC.allocate(size) {
if(!GC.disabled && existing_memory_usage + size >= existing_gc_pool) {
        GC.collect();
        if(existing_memory_usage + size >= existing_gc_pool) {
           request_more_memory_from_operating_system();
        }
   }
   if(still_not_enough_room) throw OutOfMemoryError();

   existing_memory_usage += size;
   return pointer;
}


The GC only collects when GC.collect is called, which runs as a normal function in the current thread (it pauses other threads it is aware of so they don't cause race conditions btw). GC.collect is only called when you explicitly ask for it by calling it yourself, at program termination, or when you call allocate as seen in the pseudocode above.


If you never call GC.allocate, the GC never actually does anything. It will never pause the program and it will never collect.


That's what @nogc does btw, it doesn't disable the GC since there's nothing to disable, it just flags any call to GC.allocate (including hidden ones behind the new expression, etc) as a compile error.



Remember, the D GC isn't magic and isn't actually even that complicated, it is just an ordinary function call.

Reply via email to