On Sunday, 30 September 2018 at 07:29:00 UTC, Vijay Nayar wrote:
I have two brief questions.

Code that uses "new" to create struct objects appears to compile and run. Is this an actual language feature, to get structs on the heap?

void main()
{
        struct S {int data = 1;}
        S* s1 = new S();
        S* s2 = s1;
        S s3 = *s1;  // Still copies on assignment.
        s3.data = 2;
        assert(s1.data != s3.data);
}

Second question. const class variables may not be re-assigned, so if you need a variable that may be reassigned, but may never modify the underlying object, a const pointer can be useful. However, it seems that when gets the address of a class variable, you do not get the underlying address of the class object.

How do you get a pointer to the underlying class object? Example of the problem:

void main()
{
        import std.stdio;
        class A { int data = 3; }
        A a = new A();

        void f(A a) {
        a.data = 4;
                writeln("&a = ", &a, ", a.data = ", a.data);
        }
        
    f(a);
    writeln("&a = ", &a, ", a.data = ", a.data);
}

// Output:
&a = 7FFEA6BA3158, a.data = 4 // Addresses are different, from different class variables. &a = 7FFEA6BA3180, a.data = 4 // But the same underlying class object.

Especially if I'm several levels down the call stack, how do I get a pointer to the underlying class object?

the variable `a` is a pointer (well, actually reference) to the underlying data.

void main()
{
        import core.stdc.stdio;
        class A { int data = 3; }
        A a = new A();

        void f(A a) {
        a.data = 4;
                printf("&a = %p, a = %p, a.data=%d\n", &a, a,a.data);
        }
        
    f(a);
    printf("&a = %p, a = %p, a.data=%d\n", &a,a, a.data);
}

&a = 0x7ffd0800acb8, a = 0x7fd6b05b0000, a.data=4
&a = 0x7ffd0800acd0, a = 0x7fd6b05b0000, a.data=4

The stack ^ the heap^ data on the heap^ The address of the variable a on the stack has different values across function calls, its value (the reference to the class data) remains the same, as does the data itself.

Reply via email to