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 <[email protected]>
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