[swift-evolution] Should we rename "class" when referring to protocol conformance?

Dave Abrahams dabrahams at apple.com
Mon May 16 10:14:52 CDT 2016


on Mon May 16 2016, Matthew Johnson <matthew-AT-anandabits.com> wrote:

>> On May 15, 2016, at 1:53 PM, Dave Abrahams <dabrahams at apple.com> wrote:
>> 
>> 
>> on Fri May 13 2016, Matthew Johnson <matthew-AT-anandabits.com <http://matthew-at-anandabits.com/>> wrote:
>> 
>>>>> If we’re going to hide the implementation details maybe it’s worth
>>>>> taking advantage of the type by making the props var and using CoW.
>>>>> 
>>>>> What do you think about a proposal to enhance “indirect” for value
>>>>> types and / or instances of them.  I can think of a few approaches to
>>>>> this that we could consider.  I would be much more comfortable with
>>>>> what you want to do if we tackle that as well.
>>>> 
>>>> It's a good idea that can help to make CoW easy to implement; I have
>>>> advocated for it (not in public) in the past.  
>>> 
>>> Glad to hear this.  Maybe in Swift 4?  (I know it's too early to say)
>>> 
>>>> People should be aware
>>>> that the resulting automatic CoW will be suboptimal in many cases,
>>>> because when you discover you need new storage it's usually better to
>>>> build a new value than to copy the old one and overwrite it.
>>> 
>>> How big a difference does that usually make, especially when compared
>>> to the reasons you would use indirect in the first place?  
>> 
>> Usually a big difference.
>> 
>>> Wouldn't the compiler be able to do this in the automatic
>>> implementation in some cases
>> 
>> Not in any interesting cases I know of.  If you're inserting into an
>> array and you discover you need new storage because there is more than
>> one reference, starting by copying can double the cost of the insertion
>> (on a large array when memory allocation is fast).
>
> Of course this is true of data structures.  I wouldn’t expect the
> compiler to provide a reasonable implementation of CoW for data
> structures.
>
> Maybe I wasn’t clear.  I was talking about domain model objects like the following:
>
> struct Person {
>   var firstName: String
>   var lastName: String
>   // …
> }
>
> I find it hard to believe the compiler CoW implementation would do
> something so suboptimal as to be significant when you write to
> firstName through an indirect instance in cases like this (which are
> pervasive in application code).

Oh, OK.  And you want to CoW this because...?  Reducing refcount
traffic?

>>> (such as writing to a stored var)?
>> 
>> I don't know what you mean here.
>
> Continuing with the previous example, if the CoW implementation is
> significantly better when using a memberwise initializer to construct
> the new box rather than copy the value over from the old box and then
> update the property that was written to it seems like the compiler
> should be able to make that optimization in some cases.  (i.e. when
> there exists a memberwise initializer which exposes all stored
> properties).

Sure.

-- 
-Dave


More information about the swift-evolution mailing list