If T is a struct both of the following statements will lead to a call of the _d_arrayliteral function which will allocate a array of the size of the struct just to initialize it!!

void T[] data = ...;

data[0] = T.init;
data[0] = T();

This has proven to be the biggest performance bottleneck in my current codebase, replacing this statement with a unneccessary workaround speeds my code up by factor 100. This is the cause because all of my container classes tend to reinitialize the contents of the data arrays they are holding. Also this bug makes it very hard to write non leaking code when not using a GC. The replacement code could be

T temp;
data[0] = temp;

Which works correctly as long as T is publicly accessible, if it is a private type this will not compile. Then you have to do some more fancy stuff like:

void[T.sizeof] temp;
void[] initMem = typeid(T).init();
if(initMem.ptr is null)
  memset(temp.ptr, 0, temp.length);
else
  temp[] = initMem[];
data[0] = *cast(T*)temp.ptr;

How hard would it be to fix this?

It is really a shame that reinitalizing a struct
a) is a major performance bottleneck
b) leaks memory

I created a bug ticket for this 6 months ago, but it has been ignored so far: http://d.puremagic.com/issues/show_bug.cgi?id=7271

Kind Regards
Benjamin Thaut

Reply via email to