Juliean said:
(otherwise, 32 bit would still theoretically be faster than 64 bit because their pointers are also only half size, wouldn't it)?
Using 32 bits to store a reference to something instead of a full 64-bit pointer is one reason one might choose to use handles rather than pointers - because you can fit more 32-bit or even smaller indices or handles in the CPU cache than you can 64-bit pointers. If you're in a situation where cache utilization matters (like, say, updating one out of thousands of different objects) then this may be an important optimization. If you're in a situation that is space-constrained (happens more often than you'd think at AAA scale) it might be relevant, too.
shared_ptr is something I don't typically recommend for other reasons, though. The requirement that the reference counter be thread safe is wasteful in single-threaded contexts or contexts where the synchronization is done at a higher level (eg. fork/join model) and its use frequently indicates that little thought was devoted to what should actually own the object in question.