> On Mar 16, 2016, at 1:42 PM, Brent Royal-Gordon via swift-dev > <swift-dev@swift.org> wrote: > > This is damned clever.
Yes, I agree! >> The MSB bit also becomes set if you increment or decrement a retain count >> too far. That means we can implement the RR fast path with a single >> conditional branch after the increment or decrement: > > You don't talk much about it, but I think you're suggesting that the strong > and unowned refcounts would still be packed into the same fields. It's worth > noting that your clever high-bit-indicates-slow-path trick would *not* work > on the unowned refcount, though that matters less since it doesn't get > checked as often. My understanding is that there would not be an unowned refcount here (inline in the object). The first time you make a weak reference to the object it gets converted to have the out-of-band refcount structure, and the strong and unowned refcounts both get stored there (in an undefined-by-this-proposal way). >> // out-of-object refcount (MSB bits 0b10x) >> // or refcount has overflowed (MSB bits 0b111) >> // or refcount is constant (MSB bits 0b110) > > Is this going to work on 32-bit? Even if we assume that valid pointers don't > start with 0b1, can we assume that they don't start with 1b01? The out-of-object refcount flag here is only 2 bits (0b10 in the high bits), so presumably you store the other 2 bits of the pointer in the low bits which would always be zero, assuming word-aligned pointers. So in 32-bit you can just left shift by 2 and still have the whole normal pointer length available. - Greg _______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev