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

Matthew Johnson matthew at anandabits.com
Mon May 16 11:21:38 CDT 2016

> On May 16, 2016, at 10:14 AM, Dave Abrahams <dabrahams at apple.com> wrote:
> 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?

Avoiding copying and refcounting.  This might be a large aggregate.  You might use indirect structs and CoW so that portions of the aggregate can be shared by more than one aggregate root (i.e. persistent data structure).

>>>> (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