推荐答案
在 C# 中,fixed 语句用于在代码块中固定一个托管对象的内存地址,防止垃圾回收器(GC)在内存整理过程中移动该对象。通常用于与非托管代码交互时,确保指针指向的内存地址不会发生变化。
// www.javascriptcn.com code example
unsafe void Example()
{
int[] array = new int[10];
fixed (int* ptr = array)
{
// 在此代码块中,array 的内存地址被固定
*ptr = 10;
}
}本题详细解读
fixed 语句的作用
在 C# 中,托管对象(如数组、字符串等)的内存地址是由垃圾回收器(GC)管理的。GC 会在内存整理过程中移动对象以优化内存使用。然而,在某些情况下(特别是与非托管代码交互时),我们需要确保对象的内存地址在特定代码块中保持不变。fixed 语句就是用来实现这一目的的。
使用场景
与非托管代码交互:当与非托管代码(如 C/C++ 库)交互时,可能需要将托管对象的指针传递给非托管代码。此时,使用
fixed语句可以确保托管对象的内存地址在传递过程中不会被 GC 移动。性能优化:在某些高性能场景中,直接操作固定内存地址可以避免不必要的内存复制和 GC 开销。
语法
fixed (type* ptr = expression)
{
// 在此代码块中,expression 的内存地址被固定
}type*:指向托管对象的指针类型。ptr:指针变量名。expression:需要固定内存地址的托管对象(通常是数组或字符串)。
注意事项
unsafe上下文:fixed语句必须在unsafe上下文中使用,因此需要在方法或代码块前加上unsafe关键字。作用范围:
fixed语句的作用范围仅限于其代码块内。一旦离开该代码块,对象的内存地址将不再固定。性能影响:虽然
fixed语句可以防止 GC 移动对象,但过度使用可能会导致内存碎片化,影响性能。
示例代码
// www.javascriptcn.com code example
unsafe void ModifyArray()
{
int[] numbers = new int[100];
fixed (int* p = numbers)
{
for (int i = 0; i < 100; i++)
{
*(p + i) = i;
}
}
}在这个示例中,numbers 数组的内存地址在 fixed 代码块中被固定,允许我们通过指针 p 直接修改数组内容。