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 >> <[email protected]> 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. -- -Dave _______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
