Garbage Collection for Systems Programmers
Dukc
ajieskola at gmail.com
Tue Apr 9 13:50:34 UTC 2024
On Tuesday, 9 April 2024 at 00:14:01 UTC, Walter Bright wrote:
> On 4/6/2024 9:04 AM, Carl Sturtivant wrote:
>> Don't straw-man this: none of this says that you HAVE to use
>> GC in D. There is no reason to oppose an ace GC for D on those
>> grounds.
>
> Consider the performance deficit from write-barriers.
Assignments to a pointer probably should call DRuntime handle. As
code example, any time one assigns to a pointer (including
dynamic arrays, class references, delegate contexts and so on):
```D
int* ptr;
ptr = new int(35);
```
...it would be treated as (without doing the safety checks):
```D
*cast(size_t*) &ptr = __ptrWrite!int(cast(size_t) ptr,
cast(size_t) new int(35))
```
The DRuntime definition for present behaviour would be simply
```D
pragma(inline, true)
size_t __ptrAssign(Pointee)(size_t oldVal, size_t newVal)
=> newVal;
```
and this would remain an option, but alternatively `__ptrWrite`
can have a write gate. If the write gate would just ignore any
pointers not registered to the GC it would probably continue to
work with existing code with no changes other than a slight
slowdown.
This would enable a tri-color GC, and it's better performance
could easily win far more than the write gate overhead costs in
most cases. The existing mark-and-sweep collector can still
remain an option for those who don't want write gates.
Also even when the write gates are used you could still forgo
them explicitly in unsafe code to by writing `*cast(size_t*) &ptr
= cast(size_t) newValue`. Or probably use a less ugly library
function to do the same.
More information about the Digitalmars-d
mailing list