On 07/10/2017 02:14 PM, FoxyBrown wrote:
> On Monday, 10 July 2017 at 20:13:46 UTC, Adam D. Ruppe wrote:
>> On Monday, 10 July 2017 at 20:01:39 UTC, FoxyBrown wrote:
>>> Cannot get the offset of static members of a struct
>>
>> That's because static members do not have an offset. They are not part
>> of the struct in memory, just in name.
>>
>>> We can clearly get a pointer to the static struct X
>>
>> There's barely any such thing as a static struct. That's just a struct
>> that stands without outside context.... which is almost all structs,
>> actually, so the term isn't special.
>>
>>> since &X.x is effectively the address of X(regardless nomenclature
>>> and terminology issues in D trying to hide this).
>>
>> No, it isn't. Static members are stored in an entirely different place
>> than non-static members. They are really just global variables in
>> memory with their in-source name being nested somewhere else.
>
>
> This is not true, just because there isn't any official statement, or
> even if denied, does not make it true. I have proof:
>
> auto GetStaticAddress(T)()
> {
>     mixin("auto p = cast(T*)&T."~__traits(allMembers, T)[0]~";");
>     return p;
> }
>
>
> Returns the address of a struct's static members.

Yes but that address is not offset from the beginning of any struct object. What would be its relationship to the following two objects?

import std.stdio;

auto GetStaticAddress(T)()
{
    mixin("auto p = cast(T*)&T."~__traits(allMembers, T)[0]~";");
    return p;
}

struct S {
    static int s;
    int m;
}

void main() {
    writeln("S.s is at ", GetStaticAddress!S);
    auto a = S();
    auto b = S();
    writeln("a   is at ", &a);
    writeln("b   is at ", &b);
}

Prints

S.s is at 7F6D68484710
a   is at 7FFEADF41B68
b   is at 7FFEADF41B6C

So there is no offset of S.s to speak of (i.e. number of bytes from the beginning of) neither from a nor b.

> It's pretty obvious, the compiler seems to instantiate the static
> members simply as a sort of "singleton".

Makes sense.

> They are laid out with the same
> relative offsets as the struct(which is obvious, as that is the most
> natural way). That is all that is needed to treat the memory the static
> variables use as the struct in which they are part of. No need to make
> it any more complex than that.

S.s is sitting in memory all by itself without are relation to any other S members.

> Just because D obfuscates that static structs have addresses, doesn't
> mean they don't.

I assume you mean "static members". Then, yes, of course they have addresses. And you don't even need a function like GetStaticAddress():

    writeln("S.s is at ", &S.s);

> No need to perpetuate a misnomer. Static structs and
> classes have addresses.

Again, I think you mean "static members of" or "instances of" structs and classes.

Ali

Reply via email to