One more small thing I was forgetting. In my dlibs1 there are functions similar to:
T[][] NewVoidGCMatrix(T)(int nr, int nc) { // Part of the code by Marius Muja <mari...@cs.ubc.ca> assert(nr > 0, "NewVoidCGMatrix: nr must be > 0."); assert(nc > 0, "NewVoidCGMatrix: nc must be > 0."); void* mem = cast(void*)gcmalloc(nr * (T[]).sizeof + nr * nc * T.sizeof); hasNoPointers(mem); T[]* index = cast(T[]*)mem; T* mat = cast(T*)(mem + nr * (T[]).sizeof); for (int i = 0; i < nr; ++i) { index[i] = mat[0 .. nc]; mat += nc; } return index[0 .. nr]; } void delVoidGC(T)(ref T[] a) { gcrealloc(a.ptr, 0); a = null; } They allow to allocate only one chunk of memory for a matrix, and in some situations they give a little more performance (because they give a little more CPU cache coherence). I guess such functions can't be used in D2. But maybe once I know the underlying data structure I can write something similar for D2 too. Bye, bearophile