如何撤销fixed的效果(头部设置fixed后内容滚动)

技术如何验证fixed关键字效果本篇文章为大家展示了如何验证fixed关键字效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。之前谈到String连接操作的性能,其中会涉及到un

本文向您展示了如何验证固定关键词的效果。内容简洁易懂,一定会让你眼前一亮。希望通过这篇文章的详细介绍,你能有所收获。

以前讲String join操作的性能时,会涉及到不安全的操作,不安全的操作必然会涉及到指针,于是就产生了fixed关键字。fixed关键字用于固定一个引用地址,因为我们知道CLR的垃圾收集器会改变一些对象的地址,所以改变地址后,对那些对象的引用也会相应改变。这种变化对程序员来说是无意识的,所以在指针操作中是不允许的。否则GC后找不到需要的对象,因为之前已经预留了地址。现在让我们做一个小实验来验证固定关键词的效果。

当然这个实验很简单,可能会让你笑。让我们先准备一堂SomeClass课:

public class some class { public intfield;}然后准备一段代码:

privatedstatunsafetycoutofxedblock(){ vara=new int[100];varc=NewSomeClass();固定(int * ptr=c . Field){ print address(' before GC ',(int)ptr);}GC。收集(2);固定(int * ptr=c . Field){ print address(' after GC ',(int)ptr);} } PrivateStaticVirtuprintAddress(string name,in address){ Console。Write(名称“:0 x”);控制台。写线(地址。ToString(' X ');}在GCOutOfFixedBlock方法中,我们首先分配一个长度为100的int数组,然后创建一个新的SomeClass对象。新数组的目的是创建“垃圾”,目的是在调用GC时改变SomeClass对象在堆中的位置。收集方法。由于垃圾收集发生在固定代码块之外,因此我们在之前和之后打印出的值是不同的:

GC:0x1A058C0之前

GC:后0x1975DF4

值得注意的是,这段代码必须在Release模式下编译,这样CLR才能优化代码的执行,这样CLR在垃圾收集的时候就会发现A数组是垃圾(因为后面的代码不会用到),所以会被回收——或者看不到地址变化的效果。所以,让我们重写一段代码:

privatedstatunsafetycinsidexedblock(){ vara=new int[100];varc=NewSomeClass();

    fixed (int* ptr = &c.Field)      {          PrintAddress("Before GC", (int)ptr);          GC.Collect(2);      }       fixed (int* ptr = &c.Field)      {          PrintAddress("After GC", (int)ptr);      }  }

结果如下:

Before GC: 0x1B558C0
After GC: 0x1B558C0

由于GC发生在fixed代码块内部,因此c对象被pin在堆上了,于是GC前后c对象的地址没变,这就是fixed的作用。那么,下面这段代码运行结果是什么呢?

private static unsafe void Mixed()  {      var a = new int[100];      var c1 = new SomeClass();      var c2 = new SomeClass();       fixed (int* ptr1 = &c1.Field)      {          PrintAddress("Before GC", (int)ptr1);      }       fixed (int* ptr2 = &c2.Field)      {          PrintAddress("Before GC (fixed)", (int)ptr2);          GC.Collect(2);      }       fixed (int* ptr1 = &c1.Field)      {          PrintAddress("After GC", (int)ptr1);      }       fixed (int* ptr2 = &c2.Field)      {          PrintAddress("After GC (fixed)", (int)ptr2);      }  }

上述内容就是如何验证fixed关键字效果,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/152044.html

(0)

相关推荐

  • python光学仿真面向对象光学元件类的实现是什么

    技术python光学仿真面向对象光学元件类的实现是什么python光学仿真面向对象光学元件类的实现是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能

    攻略 2021年10月20日
  • softmax 分类

    技术softmax 分类 softmax 分类为什么softmax 里面要用交叉熵这个问题之前困扰我挺久的,但这两篇博文完美解答了我的疑惑。交叉熵、相对熵和负对数似然的理解 - 最大的梦想家的文章 -

    礼包 2021年11月9日
  • TP中怎么按照周来实现将数据分类

    技术TP中怎么按照周来实现将数据分类本篇内容主要讲解“TP中怎么按照周来实现将数据分类”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“TP中怎么按照周来实现将数据分类”吧!具体

    攻略 2021年12月4日
  • 如何使用mafft进行多序列比对

    技术如何使用mafft进行多序列比对这篇文章给大家介绍如何使用mafft进行多序列比对,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。对于几千条序列的多序列比对,无论是从准确度还是运行速度上考虑,mu

    攻略 2021年11月10日
  • Python基础知识-1.7标识符和关键字

    技术Python基础知识-1.7标识符和关键字 Python基础知识-1.7标识符和关键字一、标识符上图看完了,那什么是标识符
    答:在程序中定义的一些符号和名称
    二、作用
    前面学习变量了,下面的代码,此

    礼包 2021年12月5日
  • Kafka为什么那么快

    技术Kafka为什么那么快这篇文章主要介绍“Kafka为什么那么快”,在日常操作中,相信很多人在Kafka为什么那么快问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Kafka为什么那么快”

    攻略 2021年11月13日