如何撤销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)

相关推荐

  • react如何实现文件转base64

    技术react如何实现文件转base64小编给大家分享一下react如何实现文件转base64,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    攻略 2021年11月26日
  • geth、web3.js、JSON RPC、truffle之间是什么关系?

    技术geth, web3.js, JSON RPC, truffle之间的关系是什么geth, web3.js, JSON RPC, truffle之间的关系是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希

    攻略 2021年12月14日
  • SpringMVC怎么接收参数各种场景

    技术SpringMVC怎么接收参数各种场景这篇文章主要讲解了“SpringMVC怎么接收参数各种场景”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringMVC怎么接

    攻略 2021年11月1日
  • 水浒传人物名字,《水浒传》中的主要人物是谁

    技术水浒传人物名字,《水浒传》中的主要人物是谁公孙胜 水浒传人物名字,鲁智深 ,林冲 ,吴用,李逵,宋江 ,武松,杨志等。1、姓名:宋江
    绰号:及时雨
    性格特点:为人仗义、善于用人,但总想招安。
    主要事迹:私放晁盖、怒杀

    生活 2021年10月30日
  • ES6新特性常用的知识点有哪些

    技术ES6新特性常用的知识点有哪些这篇文章主要介绍了ES6新特性常用的知识点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.关键字Let 关键字

    攻略 2021年11月13日
  • 满足解决配置DG Broker时报错Error: ORA-16698问题

    技术满足解决配置DG Broker时报错Error: ORA-16698问题这篇文章主要介绍“满足解决配置DG Broker时报错Error: ORA-16698问题”,在日常操作中,相信很多人在满足解决配置DG Bro

    攻略 2021年11月10日