Hi Arnold,

Thank you and atr...@apple.com very much for your answers. That helps already a 
lot. Are you Arnold from the WWDC Video? I removed all the answers that are 
clear and have some follow-up questions inline.

> Am 14.07.2016 um 23:02 schrieb Arnold Schwaighofer <aschwaigho...@apple.com>:
> 
>> 3. Then Arnold says that four existential containers pointing to the same 
>> value (greater than the value buffer) use 4 heap allocations. He proposes 
>> copy-on-write (using a local storage class), but **does he mean this should 
>> be implemented by hand or is this an optimization that the swift compiler 
>> does on its own?**
> 
> No the swift compiler does not do this on its own.

Are there corresponding plans? Storing „big“ values (using some statistics to 
evaluate where the break-even is) as reference types always, storing them in a 
big table per type (each value occurs only once) should be possible, right? Is 
this something I should post on the swift-evolution mailing list?

> 
>> The issue here is, that the switch between "swift subscript" for showing an 
>> abstraction of internals and real swift code that one should write is 
>> sometimes not clear.
> 
> Sorry about this.

This was meant as positive criticism. I really like the video!

> 
>> Doing this by hand has some clear disadvantages as this would add a 
>> reference to each usage of `Line` (and reference counting) even in the first 
>> examples of Kyle.
> 
> Yes, it is a tradeoff. Either, in the type erased context (as an instance of 
> protocol value) copies are expensive for large value types and in the non 
> generic/existential concrete context it is fast.

Is it really fast in the latter context for „big“ values? All collection types 
use copy-on-write. Especially if you have a lot of reference type properties 
copying seems to be slow even in the latter context. And since all collection 
types (including String) are backed by a reference type, even properties of 
these type incur additional reference counting.

> Or you make the type have indirect storage with copy on write to preserve 
> value semantics and then you have an overhead for reference counting.
> 
> You can get the best of both worlds if you write a wrapper.
> 
> All of this comes at the cost of a lot of boiler plate code and discussions 
> are taking place how-to improve this situation.

Are there already proposals available or is it still in early discussions? Can 
you give me a hint where to find more about it?

> 
>> 6. Is the Value-Witness-Table a (kind of) dictionary for all values of a 
>> given value type (bigger than the value buffer), so that you do not store 
>> any value twice on the heap, but share the reference? If this is the case 
>> the answer of *3.* should be *automatically*. But then again, the "manual" 
>> implementation of `String` and `Array` (see *4.*) make no sense anymore, 
>> does it? Or are `Array` and `String` implemented only on the lower-level and 
>> the copy-on-write implementation is not visible in their Swift 
>> implementation?
> 
> 
> I don’t full understand the question.
> 
> The value-witness-table exists per type and contains functions that describe 
> how to copy, allocate, and deallocate values of that type.

OK. I am still a little bit unsure what it is now. Andrew Trick says:

> A value witness table is a dictionary for all values of a type regardless of 
> whether it fits in a buffer.
> The keys are operations that can be done to any value (copy/destroy), the 
> implementation for
> that type knows where the value is stored.

In the example Arnold (you?) used the value witness table to copy the value 
(see slide 171 last line of code):

```swift
pwt.draw(vwt.projectBuffer(&local))
```

Since I didn’t know that the „storage“-trick is done manually, I thought there 
is a (hash)table/dictionary of all values of a „big“ value type where each 
value is uniquely stored (constant time access). For „small“ values it would 
just point, to the concrete value of this very value. As mentioned above: 
should I post this on the swift-evolution mailing list?

All the best
Johannes

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to