[swift-evolution] Should we rename "class" when referring to protocol conformance?
Dave Abrahams
dabrahams at apple.com
Thu May 19 17:07:15 CDT 2016
on Mon May 16 2016, Matthew Johnson <swift-evolution at swift.org> wrote:
>> 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).
I have no problem with adding some support for doing this manually, but
IMO the compiler *should* do it automatically for some value types.
Maybe an attribute could be used to add manual control.
--
-Dave
More information about the swift-evolution
mailing list