[swift-evolution] Improved value and move semantics
Matthew Johnson
matthew at anandabits.com
Wed Aug 3 16:21:48 CDT 2016
> On Aug 3, 2016, at 3:48 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>
>
> on Wed Aug 03 2016, Matthew Johnson <swift-evolution at swift.org> wrote:
>
>>> On Aug 2, 2016, at 4:54 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>>>
>>>
>>> on Tue Aug 02 2016, Brent Royal-Gordon <brent-AT-architechies.com> wrote:
>>>
>>
>>>>> On Aug 2, 2016, at 12:06 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>>>>>
>>>>> If it says that, it's... not quite right. There are things we could do
>>>>> to make some value copies more optimal. For example, any value type
>>>>> containing multiple class references—or multiple other value types (such
>>>>> as arrays or strings or dictionaries) that contain class references—will
>>>>> cost more to copy than a single class reference does. At the cost of
>>>>> some allocation and indirection, we could reduce the copying cost of
>>>>> such values. It's an optimization we've considered making, but haven't
>>>>> prioritized.
>>>>>
>>>>> You can put a CoW wrapper around your value to do it manually. I hacked
>>>>> one up using ManagedBuffer for someone at WWDC but I don't seem to have
>>>>> saved the code, sadly.
>>>>
>>>> Slightly off-topic, but one day I would like to see `indirect` turned
>>>> into a generalized COW feature:
>>>>
>>>> * `indirect` can only be applied to a value type (or at least to a
>>>> type with `mutating` members, so reference types would have to gain
>>>> those).
>>>> * The value type is boxed in a reference type.
>>>> * Any use of a mutating member (and thus, use of the setter) is
>>>> guarded with `isKnownUniquelyReferenced` and a copy.
>>>> * `indirect` can be applied to an enum case with a payload (the
>>>> payload is boxed), a stored property (the value is boxed), or a type
>>>> (the entire type is boxed).
>>>>
>>>> Then you can just slap `indirect` on a struct whose copying is too
>>>> complicated and let Swift transparently COW it for you. (And it would
>>>> also permit recursive structs and other such niceties.)
>>>
>>> My vision for this feature is:
>>>
>>> a. We indirect automatically based on some heuristic, as an
>>> optimization.
>>>
>>> b. We allow you to indirect manually.
>>>
>>> c. We provide an attribute that suppresses automatic indirection to
>>> whatever depth possible given resilience boundaries.
>>
>> This all sounds great. Does any of this fit into Swift 4 (either
>> phase 1 or phase 2)? It seems like at least the automatic part would
>> have ABI impact.
>
> Yes. In principle, all of it has the potential to fit in Swift 4. I'm
> not sure what will actually happen of course.
Of course. :)
I asked mostly because I am wondering when it might be appropriate to start discussing these topics in more detail, and specifically if they fit into the first phase of Swift 4 whether we should start a thread now.
>
> --
> -Dave
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
More information about the swift-evolution
mailing list