On Wed, 21 Dec 2016 11:36:14 +0000, thedeemon wrote: > Bad news: without complete redesign of the language and turning into one > more C++/CLI (where you have different kinds of pointers in the language > for GC and non-GC), having C performance and Go-style low-pause GC is > not really possible. You have to choose one. Go chose GC with short > pauses but paid with slow speed overall and slow C interop. D chose > C-level performance but paid for it with a slow GC.
You can implement write barriers as runtime calls, but omit them in @nogc code. However, this would be costly -- it's an expensive technique in general; the current GC mallocs each object instead of mmaping a range of memory; and in D you can't move heap objects safely, so you can't distinguish generations based on pointers (you'd have to mark GC data structures, and it's O(log n) to find the right one). You can implement write barriers with mprotect. However, this won't give you good granularity. You just know that someone wrote something to an 8 kilobyte block of memory that has a pointer in it somewhere. This requires the GC to use mmap instead of malloc, and it is strongly encouraged not to put pointer-free objects in the same page as objects with pointers.