标记指针是实现动态语言时的常见优化:利用对齐要求,即指针的低两位或三位始终为零,并使用它们来存储类型信息。
假设您正在使用 Boehm 垃圾收集器,它基本上通过查看活动数据来寻找看起来像指针的东西。标记指针看起来不像指针,因为它们的低位是非零的。
这是一个展示停止器,即如果您使用 Boehm,您是否必须放弃标记指针?或者它有办法解决这个问题吗?
标记指针是实现动态语言时的常见优化:利用对齐要求,即指针的低两位或三位始终为零,并使用它们来存储类型信息。
假设您正在使用 Boehm 垃圾收集器,它基本上通过查看活动数据来寻找看起来像指针的东西。标记指针看起来不像指针,因为它们的低位是非零的。
这是一个展示停止器,即如果您使用 Boehm,您是否必须放弃标记指针?或者它有办法解决这个问题吗?
AFAIK Boehm 可以通过正确的选项来处理这个问题。它能够以低廉的价格检测内部指针。也可以编写自己的扫描代码。基本上可能有足够的钩子来处理任何事情。
我写了我自己的收集器,它在堆上是精确的,在栈上是保守的。它不触及 C 提出的指针。对于某些应用程序,它会更快,因为它对我的语言分配的对象了解很多,并且不关心使用传统 C++ 析构函数管理的其他内容。
然而,它不是增量的或分代的,它也不处理线程(它不够聪明,无法用信号停止线程)。然而,从好的方面来说,它不需要 Boehm 所做的魔术链接技术(捕获 malloc 等)。在严重的负面方面,您不能将托管对象放入非托管对象中。