skinny delegates

Steven Schveighoffer schveiguy at gmail.com
Thu Aug 2 13:42:14 UTC 2018


On 8/2/18 9:21 AM, Stefan Koch wrote:
> On Thursday, 2 August 2018 at 12:57:02 UTC, Steven Schveighoffer wrote:
>> On 8/2/18 8:42 AM, Stefan Koch wrote:
>>> On Monday, 30 July 2018 at 21:02:56 UTC, Steven Schveighoffer wrote:
>>>> Would it be a valid optimization to have D remove the requirement 
>>>> for allocation when it can determine that the entire data structure 
>>>> of the item in question is an rvalue, and would fit into the data 
>>>> pointer part of the delegate?
>>>
>>> Don't do that. It's valid in simple cases.
>>
>> Those are the cases I'm referring to.
>>
> I meant it seems valid in simple cases, and I doubt you can distinguish 
> between cases that work and cases which don't work with 100% accuracy.

When the data needed in the delegate is all effectively immutable (or 
maybe *actually* immutable), I can't see how using a pointer to it is 
different than using a copy of it.

>>> As soon as you want to chain delegate pointers it falls apart.
>>
>> And so, don't do the skinny delegate optimization in that case?
>>
> Again the question is whether you can tell the cases apart with local 
> information.

This idea requires cooperation from the compiler, all the way down to 
code generation -- it's not really a lowering but a change in how the 
data is fetched from the context.

At a minimum, I would say anything that only depends on immutables can 
be a valid use case.

In order to prove effective immutability (anything that could possibly 
change elsewhere can't qualify for this), you would need a lot of local 
information. So maybe this only works if the type is actually immutable.

>>> Also the delegate might require heap allocation to be memory correct.
>>
>> Does the "might" depend on the caller or on the delegate 
>> implementation itself? The former would squash this idea.
>>
> I am not sure about that, it's just a gut feeling that skinny delegates 
> will be breaking some invariant, I may be wrong.
> 
> Coming up with specific rules and throwing them at the wall until they 
> don't break anymore, is fine for applications used in limited controlled 
> circumstances, I would not want to do it with a compiler which is used 
> by an unknown number of users.

I wasn't planning on that method of proof. What I wanted to do was start 
with the tightest possible, but easily provable constraints -- all data 
must be immutable -- and then relax as it makes sense.

What I don't know is the implications on the optimizer or semantic 
analysis -- does the context pointer being really a pointer have any 
affect on those pieces?

I also don't know what you meant by "memory correct".

-Steve


More information about the Digitalmars-d mailing list