May 16

Given

struct S
{
    int member;
}

__gshared S s;

It's clear that s.member is __gshared too, right ?
What does happen for

struct S
{
    int member;
    static int globalMember;
}

__gshared S s;

Is then S.globalMember a TLS variable ? (I'd expect that)

May 17

On Thursday, 16 May 2024 at 17:04:09 UTC, user1234 wrote:

>

Given

struct S
{
    int member;
}

__gshared S s;

It's clear that s.member is __gshared too, right ?
What does happen for

struct S
{
    int member;
    static int globalMember;
}

__gshared S s;

Is then S.globalMember a TLS variable ? (I'd expect that)

__gshared is a storage class. It means, store this thing in the global memory segment. static storage class means store this thing in TLS.

Storage classes are not transitive, and they are not type constructors. They optionally might apply a type constructor to the type (such as the const storage class), but not always.

So in this case typeof(s) is S, not __gshared S. s.member is in the global segment since structs members are placed within the struct memory location (in this case, the global memory segment).

globalMember is placed in TLS because it's storage class is static, and static means, do not store with the instance (which for s would mean the global memory segment), but rather in TLS.

-Steve