【发布时间】:2014-03-05 14:45:45
【问题描述】:
我试图找出用fixed 关键字定义的固定指针是如何工作的。我的想法是在内部使用GCHandle.Alloc(object, GCHandleType.Pinned)。但是当我查看为以下 C# 代码生成的 IL 时:
unsafe static void f1()
{
var arr = new MyObject[10];
fixed(MyObject * aptr = &arr[0])
{
Console.WriteLine(*aptr);
}
}
我找不到任何GCHandle 的踪迹。
我看到在方法中使用了固定指针的唯一提示是以下 IL 声明:
.locals init ([0] valuetype TestPointerPinning.MyObject[] arr,
[1] valuetype TestPointerPinning.MyObject& pinned aptr)
所以指针被声明为固定,并且不需要任何额外的方法调用来固定它。
我的问题是
- 在声明中使用固定指针和使用
GCHandle类固定指针有什么区别吗? - 有什么方法可以在 C# 中声明一个固定指针而不使用
fixed关键字?我需要这个在循环中固定一堆指针,我无法使用固定关键字来做到这一点。
【问题讨论】:
标签: c#