Static inline field initialization

Moritz Maxeiner via Digitalmars-d digitalmars-d at puremagic.com
Tue Aug 22 09:28:43 PDT 2017


On Tuesday, 22 August 2017 at 15:52:48 UTC, Kagamin wrote:
> On Tuesday, 22 August 2017 at 14:53:21 UTC, Moritz Maxeiner 
> wrote:
>> There is a bug [1] - as others have pointed out - that the 
>> static array isn't stored in TLS, but in global storage, 
>> however, but that doesn't apply in this single threaded case.
>
> The initializer is copied from typeinfo, that can't refer to 
> TLS data.

Which means it isn't easily fixable (or even feasible). I'd still 
consider it a loophole in the type system right now as it allows 
declaring global data mutably shared between threads without 
`shared` or `__gshared` (the latter of which couldn't be applied 
here, though).
I'd argue that - as new in this case doesn't allocate on the 
heap, but in the resulting application's appropriate segments) - 
it should work like this (from a language semantics standpoint):

---

class Test
{
     shared(ubyte)[] buf = new shared(ubyte)[1000]; // classic 
global storage, instances in all threads refer to the same static 
array
}

class Test
{
     ubyte[] buf = new ubyte[1000]; // thread local storage, 
instances in the same thread refer to the same static array
}
---


More information about the Digitalmars-d mailing list