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