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