Often repeated array allocations
Namespace
rswhite4 at googlemail.com
Sun Jul 21 03:18:21 PDT 2013
On Sunday, 21 July 2013 at 09:16:47 UTC, Jacob Carlborg wrote:
> On 2013-07-21 08:45, Namespace wrote:
>> But D isn't like Ada. It's more like C++ and there Heap
>> allocations is
>> often used too.
>> It would be really cool if we had allocators already.
>> Something like:
>> ----
>> with (AllocatorX) { /// will use malloc and free instead of
>> calling the GC
>> float[] arr;
>> arr ~= 42;
>> }
>> ----
>>
>> And I still don't know what a 'TLS scratch pad buffer' is.
>
> Perhaps:
>
> float[4000] scratchPadBuffer;
>
> void foo ()
> {
> // use scratchPadBuffer here
> }
>
> I guess he just refers to a some temporary data you need during
> the execution of a function and at the end of the function you
> don't care about it.
But then I have mostly far too much and maybe a few times a bit
too less store. It's not flexible. But maybe with a smaller
granule.
What's about this:
----
struct Chunk(T, ushort maxSize = 1024) {
public:
static T[maxSize] _chunk;
T* ptr;
size_t length;
size_t capacity;
this(size_t capacity) {
this.capacity = capacity;
if (capacity < maxSize)
this.ptr = &_chunk[0];
else
this.ptr = cast(T*) .malloc(this.capacity * T.sizeof);
}
@disable
this(this);
~this() {
if (this.ptr && this.capacity > maxSize)
.free(this.ptr);
}
void ensureAddable(size_t capacity) {
if (capacity > this.capacity) {
this.capacity = capacity;
if (this.capacity > maxSize)
this.ptr = cast(T*) .realloc(this.ptr, this.capacity *
T.sizeof);
}
}
void opOpAssign(string op : "~", U)(auto ref U item) {
this.ptr[this.length++] = cast(T) item;
}
void opOpAssign(string op : "~", U, size_t n)(auto ref U[n]
items) {
foreach (ref U item; items) {
this.ptr[this.length++] = cast(T) item;
}
}
}
----
More information about the Digitalmars-d-learn
mailing list