GC cartable 地址映射算法
inline void* CardTable::AddrFromCard(const uint8_t *card_addr) const { DCHECK(IsValidCard(card_addr)) << " card_addr: " << reinterpret_cast<const void*>(card_addr) << " begin: " << reinterpret_cast<void*>(mem_map_->Begin() + offset_) << " end: " << reinterpret_cast<void*>(mem_map_->End()); uintptr_t offset = card_addr - biased_begin_; return reinterpret_cast<void*>(offset << kCardShift); } inline uint8_t* CardTable::CardFromAddr(const void *addr) const { uint8_t *card_addr = biased_begin_ + (reinterpret_cast<uintptr_t>(addr) >> kCardShift); // Sanity check the caller was asking for address covered by the card table DCHECK(IsValidCard(card_addr)) << "addr: " << addr << " card_addr: " << reinterpret_cast<void*>(card_addr); return card_addr; }
效率提高40%

浙公网安备 33010602011771号