On 6/19/23 2:01 PM, axricard wrote:


Does it mean that if my function _func()_ is as following (say I don't use clobber), I could keep a lot of memory for a very long time (until the stack is fully erased by other function calls) ?


```
void func()
{
    Foo[2048] x;
    foreach(i; 0 .. 2048)
      x[i] = new Foo;
}
```


When the GC stops all threads, each of them registers their *current* stack as the target to scan, so most likely not.

However, the compiler/optimizer is not trying to zero out stack unnecessarily, and likely this leads in some cases to false pointers. Like I said, even the "clobber" function might not actually zero out any stack because the compiler decides writing zeros to the stack that will never be read is a "dead store" and just omit that.

This question comes up somewhat frequently "why isn't the GC collecting the garbage I gave it!", and the answer is mostly "don't worry about it". There is no real good way to guarantee an interaction between the compiler, the optimizer, and the runtime to make sure something happens one way or another. The only thing you really should care about is if you have a reference to an item and it's prematurely collected. Then there is a bug. Other than that, just don't worry about it.

-Steve

Reply via email to