So, I’m getting into this thread kind of late, and I’ve only skimmed most of 
it, but…

A special FSA on the stack seems like the wrong direction. Wouldn’t it make 
more sense to have *all* value types that don’t change in size — including 
`let` Arrays — live on the stack? In which case, FSA would merely act like a 
normal `let` Array, without RangeReplaceableCollection conformance, whose 
elements could be changed via subscripting. I know nothing about the underlying 
implementation details of Swift, so I may be way off base here.

> On Aug 4, 2017, at 2:18 AM, David Hart <da...@hartbit.com> wrote:
> 
> Don’t small arrays live on the stack?
> 
>> On 4 Aug 2017, at 06:35, Félix Cloutier via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> As far as I can tell, currently, all arrays live on the heap.
>> 
>>> Le 3 août 2017 à 19:03, Robert Bennett via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> a écrit :
>>> 
>>> Where do constant Arrays currently live? I hope the answer is on the stack, 
>>> since their size doesn’t change.
>>> 
>>> On Aug 3, 2017, at 8:44 PM, Taylor Swift via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>>> 
>>>> 
>>>> On Thu, Aug 3, 2017 at 8:20 PM, Karl Wagner via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>> 
>>>>>> The root cause, of course, is that the VLAs require new stack 
>>>>>> allocations each time, and the stack is only deallocated as one lump 
>>>>>> when the frame ends.
>>>>> 
>>>>> That is true of alloca(), but not of VLAs.  VLAs are freed when they go 
>>>>> out of scope.
>>>>> 
>>>> 
>>>> Learned something today.
>>>> 
>>>> Anyway, if the goal is stack allocation, I would prefer that we explored 
>>>> other ways to achieve it before jumping to a new array-type. I’m not 
>>>> really a fan of a future where [3; Double] is one type and (Double, 
>>>> Double, Double) is something else, and Array<Double> is yet another thing.
>>>> 
>>>> They are completely different things. 
>>>> 
>>>> [3; Double] is three contiguous Doubles which may or may not live on the 
>>>> stack. 
>>>> 
>>>> (Double, Double, Double) is three Doubles bound to a single variable name, 
>>>> which the compiler can rearrange for optimal performance and may or may 
>>>> not live on the stack. 
>>>> 
>>>> Array<Double> is an vector of Doubles that can dynamically grow and always 
>>>> lives in the heap.
>>>>  
>>>> 
>>>> From what I’ve read so far, the problem with stack-allocating some Array 
>>>> that you can pass to another function and which otherwise does not escape, 
>>>> is that the function may make an escaping reference (e.g. assigning it to 
>>>> an ivar or global, or capturing it in a closure).
>>>> 
>>>> How about if the compiler treated every Array it receives in a function as 
>>>> being potentially stack-allocated. The first time you capture it, it will 
>>>> check and copy to the heap if necessary. All subsequent escapes (including 
>>>> passing to other functions) use the Array known to be allocated on the 
>>>> heap, avoiding further checking or copying within the function.
>>>> 
>>>> The same goes for Dictionary, and really any arbitrary value-type with COW 
>>>> storage. The memory that those types allocate is part of the value, so it 
>>>> would be cool if we could treat it like that.
>>>> 
>>>> 
>>>> This is not true. FSAs have nothing to do with automatic storage, their 
>>>> static size only makes them eligible to live on the stack, as tuples are 
>>>> now. The defining quality of FSAs is that they are static and contiguous. 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 

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

Reply via email to