3 ms·
No because in Rust and C++ using smart pointers is an explicit choice that is applied manually when required and is present both in the type signature everywher
by the_duke 8y ago
No because in Rust and C++ using smart pointers is an explicit choice that is applied manually when required and is present both in the type signature everywhere a reference counted type is used, and in the construction of values.
In Swift the reference counting is a implementation detail of automatic and transparent memory management. (that you only really have to care about when you have cycles)
That's why Swift definitely counts as a GC language for me.
Sure, if you put things behind a Arc<T> or shared_ptr you use reference counting in C++ and Rust, but it is not an inherent feature of the language.
- chobytes 8y agoARC only applies to reference types. The programmer has acess to value types, and manual memory management if they want it.
- 0815test 8y agoIn Rust, using smart pointers is not much of an "explicit choice" - it's simply the idiomatic thing to do when something might be kept around by more than one parent object. Rc<T> basically means that there are multiple sources of control over T's lifetime, but these are all within a single thread; and Arc<T> signals that the control might extend to multiple threads. It's not "mere implementation" that we're dealing with here; it's the very semantics of the code as it relates to Rust's expanded take on the well-known RAII pattern. Swift simply lacks an equivalent to either the Rc<> specifier or e.g. Rust's Box<>, which expresses the semantics of an object which is heap-allocated and accessed via an indirection, and verifiably has at all times a unique "owner" controlling its lifetime (as per usual RAII).
- steveklabnik 8y agoYou can argue it’s an explicit choice because you can often choose to structure your code in a way that doesn’t require Rc. Of course, it exists because sometimes, you do have to or want to, but those cases are pretty rare in my experience.