On Thursday, 21 April 2016 at 19:37:59 UTC, QAston wrote:
On Thursday, 21 April 2016 at 17:27:09 UTC, Alex wrote:
Ok. So, does this mean, that they just allocate on
creation/binding them? If so, there is no problem and there
are no questions any more.
Just like classes - when closure expression is executed.
I have an unusual caption... On creation I capture an
immutable id for my delegates, which are stored in an array.
Indeed, the id of the delegate is just the position of it in
its array.
Then, I call my delegate as a function with a parameter,
depending on it, the call is delegated to another objects
(with the stored id, of course :) )
Another possibility, which I could imagine is: not to store
the id and let the delegate calculate it by some pointer
arithmetic from the array wherein it is stored. Then, no
independent data would be stored at all. This would assume
however, that different function pointers won't be merged,
although the one and only distinction between them would be
the fact of storing them at different array indices.
Instead of using a delegate you can use a Struct with opCall.
Pass what you want to copy to the struct by using a constructor
and put your function code in opCall method.
An example here:
https://github.com/QAston/transducers-dlang/blob/master/source/transduced/transducers.d#L797
you can see there various variants of doing the same operation,
using closure, function and struct.
Yes, I can. I even used a struct before. But then, all properties
of it were moved to other classes and I decided to not have a
struct just for storing an id. Well, storing an id alone would
maybe be ok for me, but I also have the knowledge, that the id
has to be an ordinal number. And that is why I thought a struct
would be not worth it.
But the solution with the opCall is cool. Thanks for the hint.
So my question was, if I messed up the speed of my code, by
removing the struct. And if the allocation is done like classes -
then it is no problem. I allocate them all once: at the beginning
of my prog, then only use them as functions, so the allocating is
just an initialization effort and nothing bad is happening.