单个数组元素的固定语句
fixed statement for a single array element
方法中的以下代码是否正确?
int[] a = { 1, 2, 3, 4, 5 };
unsafe
{
fixed (int* p = &a[0])
{
p[1] = 3;
}
}
它没有错误,但由于 a[0]
已修复而 a[1]
未明确修复,a[1]
.
可能有一些 GC 内存移动
这个怎么样?:
int[] a = { 1, 2, 3, 4, 5 };
unsafe
{
fixed (int* p = &a[1])
{
p[0] = 3;
}
}
您固定的变量是a
。它作为单一分配进行管理。永远不会重定位单个数组元素,只会重定位整个数组。
根据您的需要,您可以考虑使用 stackalloc 来代替在堆栈而不是堆上分配内存。堆栈上的变量不受 GC 的影响,因此不需要固定。
以下都将数组arr中第一个元素的地址赋值给指针p。
fixed (double* p = arr)
与
相同
fixed (double* p = &arr[0])
在你的例子中,你将第二个元素赋给了一个指针
fixed (double* p = &arr[1])
在任何情况下,阵列都会被固定并防止移动。
方法中的以下代码是否正确?
int[] a = { 1, 2, 3, 4, 5 };
unsafe
{
fixed (int* p = &a[0])
{
p[1] = 3;
}
}
它没有错误,但由于 a[0]
已修复而 a[1]
未明确修复,a[1]
.
这个怎么样?:
int[] a = { 1, 2, 3, 4, 5 };
unsafe
{
fixed (int* p = &a[1])
{
p[0] = 3;
}
}
您固定的变量是a
。它作为单一分配进行管理。永远不会重定位单个数组元素,只会重定位整个数组。
根据您的需要,您可以考虑使用 stackalloc 来代替在堆栈而不是堆上分配内存。堆栈上的变量不受 GC 的影响,因此不需要固定。
以下都将数组arr中第一个元素的地址赋值给指针p。
fixed (double* p = arr)
与
相同fixed (double* p = &arr[0])
在你的例子中,你将第二个元素赋给了一个指针
fixed (double* p = &arr[1])
在任何情况下,阵列都会被固定并防止移动。