Andre Weissflog 这篇 2018 年的老文讲他用「索引句柄」替代裸指针与智能指针的做法,底气来自 15 年、50 万到 100 万行规模的 C++ 代码经验——最坏的情况是几十万个各自独立堆分配、彼此用智能指针互相指向的小对象。核心论点:指针的问题是它同时承担身份与地址两个职责,一旦对象被释放,残留指针既不能判活也无法复用槽位;句柄只是一个索引,指向一张由系统管理的槽位表,槽位里放代际计数就能识别「指向已被复用的旧对象」。原文末尾 2018 年 11 月补了一段,专门讲用每槽代际计数器防止句柄碰撞。
🔑 核心要点
把身份与地址拆开:句柄是索引,存活判断由槽位表和代际计数负责。
代际计数解决复用歧义:同一槽位被新对象占用时,旧句柄因代际不匹配自动失效。
结论来自规模:0.5 到 1 百万行、几十万个小对象、彼此智能指针互指的真实代码库。
这是数据导向设计的典型取舍:用一次数组索引换掉指针追逐与缓存不友好。
💡 金句
…wherein I talk a bit about how I’m doing dynamic memory management in C and C++ these days which basically replaces raw- and smart-pointers with ‘index-handles’.