Objects(from classes) at Compile time? no gc

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu May 15 23:16:05 PDT 2014


On 05/15/2014 09:59 PM, Taylor Hillegeist wrote:
> The subject says it all really. i have this example:
>
> import core.memory;
>
> class fruit{
>    int value=5;
>    public int getvalue(){
>      return value;
>    }
> }
>
> int main(string[] args) {
>      GC.disable;
>      static fruit myfruit;
>      return myfruit.getvalue();
> }
>
> Most of the smart people will see that i want the program to return 5
> but I did something dumb and didn't put in the "new" statement?
>
> So my question is in longer words "Can I create instances of objects at
> compile time?" and if not "why not, i could build something
> (roughly)equivalent out of structs and functions and have it at compile
> time?"

Here are two ways of achieving it. Although f0 is constructed by new, I 
don't think that new is executed at run time (because it would conflict 
with 'static const'). f1 is definitely not using the GC because it is 
placed on a storage that the module owns:

class Fruit {
     int value;

     this (int value)
     {
         this.value = value;
     }

     public int getvalue() const {
         return value;
     }
}

static const f0 = new Fruit(42);

ubyte[__traits(classInstanceSize, Fruit)] storage;
static const Fruit f1;

static this()
{
     import std.conv;
     f1 = emplace!Fruit(storage[], 43);
}

void main() {
     assert(f0.getvalue() == 42);
     assert(f1.getvalue() == 43);
}

Ali



More information about the Digitalmars-d-learn mailing list