Thanks, +1 for rewriting it like that. /Jens On Fri, Aug 5, 2016 at 9:58 PM, Andrew Trick <atr...@apple.com> wrote:
> > On Aug 5, 2016, at 12:43 PM, Jens Persson <j...@bitcycle.com> wrote: > > I'm trying to understand the new Swift 3 (4?) pointer API and Swift's > memory model. > > More specifically, I'd like to know more about what exactly it means for a > pointer to be initialized or not. > > For example, I suppose the following code example doesn't satisfy the > precondition in the subscript documentation (ie floatsPtr not being > initialized when using its subscript): > > let numFloats = 123 > let floatsPtr = UnsafeMutablePointer<Float>.allocate(capacity: numFloats) > for i in 0 ..< numFloats { floatsPtr[i] = Float(i) * 0.1 } // Setting > values > for i in 0 ..< numFloats { print(floatsPtr[i]) } // Getting values > floatsPtr.deallocate(capacity: numFloats) > > I'd like to understand why/how this could lead to undefined behavior, and > what exactly it means for a pointer to be initialized or not. > > I've read https://github.com/apple/swift-evolution/blob/master/ > proposals/0107-unsaferawpointer.md > > But I don't feel that I fully understand what it means for a pointer to be > initialized, or bound, and if the preconditions and rules for undef > behavior are the same no matter if Pointee is a trivial type or a class > type. > > > I think it’s common practice to initialize trivial types via subscript > assignment. Earlier versions of the proposal actually showed examples of > this and claimed that it was valid pattern. However, during review those > examples were removed because it encouraged bad practice and complicated > the issue. > > The fact is, code like this is not going to break anything in the compiler > and it’s common enough that any model model verifier is going to need to > special-case trivial types. I think it would be fine to rewrite the > subscript precondition as follows: > > /// - Precondition: the pointee at `self + i` is initialized. > should read > /// - Precondition: either the pointee at `self + i` is initialized > /// or `Pointee` is a trivial type. > > https://github.com/apple/swift-evolution/blob/master/proposals/0107- > unsaferawpointer.md#trivial-types > > -Andy > -- bitCycle AB | Smedjegatan 12 | 742 32 Östhammar | Sweden http://www.bitcycle.com/ Phone: +46-73-753 24 62 E-mail: j...@bitcycle.com
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev