gpt4 book ai didi

c# - 'fixed' : working on memory location or object? 的内部工作

转载 作者:行者123 更新时间:2023-11-30 12:11:46 24 4
gpt4 key购买 nike

在托管/非托管阵列互操作性中,我有一个没有通常的情况

fixed (byte* data = new byte[length])
{
// work with the array
}

相反,我想固定一个数组,我只得到一个引用,就像这样:

IntPtr dataPtr = camera.Image2d.GetDataBuffer();
fixed (byte* data = (byte *)dataPtr)
{
// work with the array
}

1) 根据我的理解,底部代码也应该有效,因为“固定”将在内存管理器中将内存位置固定在低级别,而不关心指向它的任何对象? (意思是,我没有“根”/直接指针——尽管可能没有任何这样的概念。)

另外一个问题:

2) 使用“固定”的要求来自 CLR 内存管理器与任何已执行代码并发运行,因此它可以随时移动数组?

最佳答案

1) 第二个似乎不合适,因为使用 fixed 关键字您试图固定指针,而不是实际对象。而且 IntPtr 甚至不是(afaik)托管指针,而是非托管指针。

2) fixed 创建一个指向指定托管变量的指针;如果没有固定,GC 可能会将变量重新定位到另一个内存位置,因此指针将变得无用。

来自 msdn :

The fixed statement sets a pointer to a managed variable and "pins" that variable during the execution of the statement. Without fixed, pointers to movable managed variables would be of little use since garbage collection could relocate the variables unpredictably. The C# compiler only lets you assign a pointer to a managed variable in a fixed statement.

关于c# - 'fixed' : working on memory location or object? 的内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14725069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com