== Quote from Ivo Kasiuk (i.kas...@gmx.de)'s article
> > ~snip
> > > ----------------------------------------
> > > This writes:
> > > new uint
> > > no reference
> > > ========== reference, f7490e20, f7490e10, f7490df0,
>  f74
> > > 90dd0
> > > AA
> > > struct
> > > uint
> > > reference
> ...
> > > Thanks,
> > > Ivo
> >
> > In D1:
> ...
> > Writes:
> > no reference
> > ========== reference, ad3fd0, ad3fb0, ad3f90
> > new uint  << ;)
> > AA
> > uint
> > reference
> Thanks for trying it out in D1.
> So, summing up this means that:
> - In most cases, memory is by default scanned for pointers regardless of
> the actual data types.
> - In D2, newly allocated memory for a non-pointer data type (like "new
> uint" or "new uint[10]") is not scanned by default.
Isn't p a pointer data type?
I didn't even know I could do "i = new int;" :D

> - In D1, you have to use hasNoPointers if you want some memory not to be
> scanned.
> Is this observation correct?
> And what about structs/classes that have integer fields as well as
> pointer/reference fields?
> And what about associative arrays - apparently these are scanned even if
> the type is uint?
> Ivo

I added the struct again and also ran without the enclosing X class.

With X :
no reference
========== reference, ad3fd0, ad3fc0, ad3fa0, ad3f80
new uint
AA
struct
uint
reference

Without X :
no reference
========== reference, ad2fd0, ad2fc0, ad2fa0, ad2f80
new uint

--
import std.stdio;
import std.gc;

class C {
        string s;
        this(string s) { this.s=s; }
        ~this() { writefln(s); }
}

struct S {
        uint r;
        static S opCall(uint x) {
                S s;
                s.r = x;
                return s;
        }
}

class X{
        C c;
        uint r;
        S s;
        uint[int] a;
        uint* p;

        this() {
                c = new C("reference");
                new C("no reference");
                r = cast(uint) cast(void*) new C("uint");
                s = S(cast(uint) cast(void*) new C("struct"));
                a[0] = cast(uint) cast(void*) new C("AA");
                p = new uint;
                *p = (cast(uint) cast(void*) new C("new uint"));
        }

}

void main(string[] args)
{
        /+
        c = new C("reference");
        new C("no reference");
        r = cast(uint) cast(void*) new C("uint");
        s = S(cast(uint) cast(void*) new C("struct"));
        a[0] = cast(uint) cast(void*) new C("AA");
        p = new uint;
        *p = (cast(uint) cast(void*) new C("new uint"));
        +/
        X x = new X;
        std.gc.fullCollect();
        writefln("========== %s, %x, %x, %x, %x", x.c.s, x.r, x.s.r, 
x.a[0],*x.p);
        //writefln("========== %s, %x, %x, %x, %x", c.s, r, s.r, a[0],*p);
}

Reply via email to