Gle*_*den 4 .net garbage-collection managed ref
鉴于最新版本的C#7中新的ref locals和ref return功能,这个问题是新近相关的:
随着C#中托管变量或"内部" - 指针变量的突出和广泛使用,有时您可能需要为这样的指针恢复相应的包含 Pinnable GC对象.例如,如果要传递一个指向类型数组元素的托管指针T,则可能需要数组引用T[]本身才能调用(例如)Array.Copy(...).
所以,从托管代码,是否有任何合理合法以回收含GC对象句柄方式,给出以下两种流行内部的/管理的指针(
ref,out,in)使用:
- 指向GC对象实例中(
struct或class)字段的内部指针;- 管理指向Array 的(
struct或class)元素T的指针T[].
在.NET内部,GC似乎使用以下函数:/ coreclr/master/src/gc/gc.cpp
#ifdef INTERIOR_POINTERS
// will find all heap objects (large and small)
uint8_t* gc_heap::find_object (uint8_t* interior, uint8_t* low)
{
....
Run Code Online (Sandbox Code Playgroud)
此代码遍历已知的GC堆,检查指定的内部指针是否落在已知GC对象分配的范围内.显然,这种方法不容易从最终用户托管代码中访问,而且据我所知,如果没有GC正在进行中,则可能甚至不相关.
我还查看了新的Span<T>和System.Memory库,但是找不到一系列可以恢复(例如)数组句柄的操作,如果你没有从第一个位置提供它(那时包含的句柄在那些中被squirleled)各种结构).如果_pinnable是可选的(例如Span<T>),似乎如果您不选择加入,则没有能够将其取回的代码.
简介:有没有办法从托管指针恢复包含对象句柄?
[edit:]如果托管指针指向堆栈上的值类型,那么(推定)句柄恢复功能通过(例如)返回'null'来指示失败将是完全合理的.
不可以,无法从内部指针恢复包含对象.在GC期间,由于所谓的砖表和插件树,内部指针被转换为相应的对象.给定指定的地址,计算正确的砖表条目,并遍历相应的插件树以找到该地址所在的插件.最后,逐个对象地扫描该插件以找到包含所考虑的地址的插头.
重点是那些树只是在GC期间构建和可用的.因此,即使存在这样的"内部指针恢复"API,它也必须等待GC并且之后才能提供答案(这看起来非常不切实际).其他解决方案,如线性内存扫描,显然可能会带来巨大的开销.
| 归档时间: |
|
| 查看次数: |
269 次 |
| 最近记录: |