我一直在阅读docs for the new C# 7.2 update,而且我不确定我是否了解了ref struct
声明部分特定部分的含义。
这是:
[...]另外,在GC堆上放置托管指针通常会在JIT时崩溃。
这究竟是什么意思?让我们说我有这样的事情:
IntPtr ptr = Marshal.AllocHGlobal(sizeof(float) * 100);
float* pt = (float*)ptr.ToPointer();
Parallel.For(0, 10, i =>
{
for (int j = 0; j < 10; j++) pt[i * 10 + j] = i * 10 + j;
});
或另一个例子:
float[,] m = new float[10, 10];
fixed (float* pt = m) // I know I could put this inside the lambda, but this
{ // way the pointer should be captured by the closure
// and therefore end up on the GC heap
Parallel.For(0, 10, i =>
{
for (int j = 0; j < 10; j++) pt[i * 10 + j] = i * 10 + j;
});
}
我假设在这两种情况下都会捕获float*
指针并将其存储在闭包内的GC堆上,所以:
谢谢!