On Wednesday, 7 December 2016 at 00:20:11 UTC, Ali Çehreli wrote:
tl;dr; go to the TLDR section below. :)

[...]

struct S {
    int i = void;
    double d = void;
    ubyte[10_000] a = void;
}

class C {
    S s = void; // (Same result even without the =void)
}

void main() {
}

[...]
0000000004446260 0000000000003633 T _D4core4time8Duration13_toStringImplMxFNaNbNfZAya
0000000004505140 0000000000003707 T _d_arraysetlengthiT
0000000006681456 0000000000010032 V _D6deneme1C6__initZ

Now we have a 10032 byte C.init.

Is there a rationale for this or is this an implementation quality issue? Is there a bug already? I could not find one.

Also, I failed to find the "= void" documentation e.g. not on the struct spec page.

Thank you,
Ali

Non initialized classes just don't work. Because of the hidden classes fields an initializer is **always** needed. What happens in your example is that the initializer size is sub optimal.

A naive make without emplace():

====
import std.traits, std.c.stdlib;

CT make(CT, A...)(A a)
{
    auto memory = malloc(__traits(classInstanceSize, CT));
version(none) emplace!Foo(memory[0..__traits(classInstanceSize, CT)]);
    static if (__traits(hasMember, CT, "__ctor"))
        (cast(CT) (memory)).__ctor(a);
    return cast(CT) memory;
}

class Foo{void foo(){}}

void main()
{
    Foo foo = make!Foo;
    foo.foo;
}
====

crashes with a segfault....

Reply via email to