On Thu, 11 Dec 2008 02:13:58 +0300, Weed <[EMAIL PROTECTED]> wrote:

Denis Koroskin пишет:
On Thu, 11 Dec 2008 01:31:32 +0300, Weed <[EMAIL PROTECTED]> wrote:

But my class does not contain data that need initialization and can be created
in compile time

code:

import std.stdio;

class MyClass
{
    invariant uint a = 0;
}

void main()
{
    static MyClass c = new MyClass;
    writeln( c.a );
}
 There is a memory allocation that may occurs at run time only.

In C++ analogous construction means creation of uninitialized static pointer (in compile time) and it's initialization at first execution this line in the function.

Why D does not behave that way on this construction?

You can this easily yourself.

// That's what C++ do under the hood:
static MyClass c = null;
if (c is null) {
   c = new MyClass();
}

But it is
a) thread-unsafe
b) a runtime check is done upon every function execution

It can be replaced with a more sophisticated (and error prone) solution:

static MyClass c = null;
if ( (auto old = c) is null ) {
   MyClass tmp = new MyClass();
   if (!CAS(&c, old, tmp)) {
       delete tmp;
   }
}

While it is (arguably) safe, two object might co-exist for a short amount of 
time, which is unacceptable in many case.

As a summary, the C++ solution is full of problems and leads to bad design 
practices. The D way is to avoid them.

You should use a private global variable that is initialized in a static 
initializer (static this) or a plain old struct, instead.

Reply via email to