> On Aug 3, 2016, at 8:46 PM, Chris Lattner via swift-evolution 
> <[email protected]> wrote:
> 
> On Aug 3, 2016, at 7:57 PM, Joe Groff <[email protected]> wrote:
>>>>> 
>>>>> a. We indirect automatically based on some heuristic, as an
>>>>> optimization.
>>> 
>>> I weakly disagree with this, because it is important that we provide a 
>>> predictable model.  I’d rather the user get what they write, and tell 
>>> people to write ‘indirect’ as a performance tuning option.  “Too magic” is 
>>> bad.
>> 
>> I think 'indirect' structs with a heuristic default are important to the way 
>> people are writing Swift in practice. We've seen many users fully invest in 
>> value semantics types, because they wants the benefits of isolated state, 
>> without appreciating the code size and performance impacts. Furthermore, 
>> implementing 'indirect' by hand is a lot of boilerplate. Putting 
>> indirectness entirely in users' hands feels to me a lot like the "value if 
>> word sized, const& if struct" heuristics C++ makes you internalize, since 
>> there are similar heuristics where 'indirect' is almost always a win in 
>> Swift too.
> 
> I understand with much of your motivation, but I still disagree with your 
> conclusion.

^I understand and agree with much of your motivation...

-Chris

>  I see this as exactly analogous to the situation and discussion when we 
> added indirect to enums.  At the time, some argued for a magic model where 
> the compiler figured out what to do in the most common “obvious” cases.  
> 
> We agreed to use our current model though because:
> 1) Better to be explicit about allocations & indirection that implicit.  
> 2) The compiler can guide the user in the “obvious” case to add the keyword 
> with a fixit, preserving the discoverability / ease of use.
> 3) When indirection is necessary, there are choices to make about where the 
> best place to do it is.
> 4) In the most common case, the “boilerplate” is a single “indirect” keyword 
> added to the enum decl itself.  In the less common case, you want the 
> “boilerplate” so that you know where the indirections are happening.
> 
> Overall, I think this model has worked well for enums and I’m still very 
> happy with it.  If you generalize it to structs, you also have to consider 
> that this should be part of a larger model that includes better support for 
> COW.  I think it would be really unfortunate to “magically indirect” struct, 
> when the right answer may actually be to COW them instead.  I’d rather have a 
> model where someone can use:
> 
> // simple, predictable, always inline, slow in some cases.
> struct S1 { … }  
> 
> And then upgrade to one of:
> 
> indirect struct S2 {…}
> cow struct S3 { … } 
> 
> Depending on the structure of their data.  In any case, to reiterate, this 
> really isn’t the time to have this debate, since it is clearly outside of 
> stage 1.
> 
> -Chris
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to