Delegate Memory Usage & Optimization
Orvid King
blah38621 at gmail.com
Wed Dec 11 20:25:11 PST 2013
On Wed, 11 Dec 2013 22:16:08 -0600, Manu <turkeyman at gmail.com> wrote:
> On 12 December 2013 14:06, Manu <turkeyman at gmail.com> wrote:
>> On 12 December 2013 13:45, Maxime Chevalier-Boisvert
>> <maximechevalierb at gmail.com> wrote:
>>>> It only allocates a closure if (1) it thinks the delegate may escape
>>>> the scope and (2) uplevel references are used in the delegate.
>>>
>>> The delegate will escape the enclosing scope. I'm wondering if there
>>> will still be some kind of scope object allocated to represent
>>> escaping values in >>>the englobing stack frame, even when there are
>>> no escaping values.
>>>
>>> I don't mind paying the small cost of an extraneous null context
>>> pointer, but having a whole unnecessary context object allocated seems
>>> wasteful.
>>
>> If you have no use for the context pointer, then it sounds like what
>> you want is a function pointer, not a delegate.
>>
>> A delegate is just a function-ptr+context-ptr pair, it is a trivial
>> struct that is passed by value, the same as a dynamic array. The
>> context pointer may be >>to a stack frame (in case of a closure), or a
>> class object (in the case of a class method pointer).
>> If you intend a null context pointer (ie, function doesn't reference
>> any state), than what you really have is a function pointer, not a
>> delegate. You >>should use a function pointer instead.
>
> Oh sorry, I see. you just mean in some cases functions that don't access
> state will be bound to your delegate.
> It seems unusual to me for a function that doesn't access any state to
> produce a delegate. Wouldn't it be static, or a free function in that
> case?
>
> There are tricks to bind a free function to a delegate using a little
> call-through stub. It sets the delegate function to a callthrough-stub
> which internally >casts 'this' to a 'function' and calls it with the
> same arguments.
> Don does it to bind static functions to delegates in his C++
> FastDelegate library. I wonder if there's a helper in phobos?
> You can be sure when assigning functions to delegates in this way that
> there will never be any associated state.
>
>> Can you show your usage?
>>
>>>> I strongly suggest trying out a couple examples, and disassembling
>>>> the result to confirm.
>>>
>>> I'll look into that.
>>
>
Actually, you could simply use function pointers rather than delegates,
and when you need to pass them as a delegate, pass them through
std.functional.toDelegate, which, for a function pointer at least,
utilizes a union to set the delegate's context pointer to null, and sets
the function pointer to the one you've passed in.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20131211/13f81a77/attachment.html>
More information about the Digitalmars-d
mailing list