返回顶部
首页 > 资讯 > 精选 >如何验证fixed关键字效果
  • 402
分享到

如何验证fixed关键字效果

2023-06-17 19:06:03 402人浏览 薄情痞子
摘要

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

本篇文章为大家展示了如何验证fixed关键字效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

之前谈到String连接操作的性能,其中会涉及到unsafe操作,而unsafe操作必然会涉及到指针,于是fixed关键字也应运而生。fixed关键字是用来pin住一个引用地址的,因为我们知道CLR的垃圾收集器会改变某些对象的地址,因此在改变地址之后指向那些对象的引用就要随之改变。这种改变是对于程序员来说是无意识的,因此在指针操作中是不允许的。否则,我们之前已经保留下的地址,在GC后就无法找到我们所需要的对象。现在就来我们就来做一个小实验,验证fixed关键字的效果。

当然,这个实验很简单,简单地可能会让您笑话。首先我们来准备一个SomeClass类:

public class SomeClass  {      public int Field;  }

然后准备一段代码:

private static unsafe void GCOutOfFixedBlock()  {      var a = new int[100];      var c = new SomeClass();       fixed (int* ptr = &c.Field)      {          PrintAddress("Before GC", (int)ptr);      }       GC.Collect(2);       fixed (int* ptr = &c.Field)      {          PrintAddress("After GC", (int)ptr);      }  }   private static void PrintAddress(string name, int address)  {      Console.Write(name + ": 0x");      Console.WriteLine(address.ToString("X"));  }

在GCOutOfFixedBlock方法中,我们首先分配一个长度为100的int数组,然后新建一个SomeClass对象。新建数组的目的在于制造“垃圾”,目的是在调用GC.Collect方法时改变SomeClass对象在堆中的位置。由于垃圾回收发生在fixed代码块之外,这样我们前后两次打印出的值便是不同的:

Before GC: 0x1A058C0
After GC: 0x1975DF4

值得注意的是,这段代码必须在Release模式下进行编译,让CLR执行代码时进行优化,这样CLR便会在垃圾回收时发现a数组已经是垃圾了(因为后面的代码不会用它),于是会将其回收——否则便无法看出地址改变的效果来。那么,我们重写一段代码:

private static unsafe void GCInsideFixedBlock()  {      var a = new int[100];      var c = new SomeClass();       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关键字效果,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何验证fixed关键字效果

本文链接: https://lsjlt.com/news/292332.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何验证fixed关键字效果
    本篇文章为大家展示了如何验证fixed关键字效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。之前谈到String连接操作的性能,其中会涉及到unsafe操作,而unsafe操作必然会涉及到指针,于...
    99+
    2023-06-17
  • iOS生成图片数字字母验证效果
    本文实例为大家分享了iOS生成图片数字字母验证的具体代码,供大家参考,具体内容如下 直接上代码,注释很详细 #import "CaptchaView.h" #define k...
    99+
    2022-05-19
    iOS 图片验证 数字验证
  • Android如何自定View实现滑动验证效果
    本篇内容主要讲解“Android如何自定View实现滑动验证效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何自定View实现滑动验证效果”吧!效果图自定义属性代码<xm...
    99+
    2023-06-22
  • laravel如何关闭csrf验证
    这篇文章主要介绍laravel如何关闭csrf验证,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!laravel关闭csrf验证的方法:1、打开Kernel.php,注释“App\Http\Middleware\Ver...
    99+
    2023-06-22
  • Ajax如何实现模拟关键字智能匹配搜索效果
    小编给大家分享一下Ajax如何实现模拟关键字智能匹配搜索效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!准备数据keyword.json:(这里只贴出部分数据)...
    99+
    2023-06-08
  • jquery如何实现验证数字
    本篇内容主要讲解“jquery如何实现验证数字”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jquery如何实现验证数字”吧! 方法...
    99+
    2024-04-02
  • PHP如何高效地存储关键字数组?
    PHP是一门流行的服务器端脚本语言,它被广泛应用于Web开发和数据处理。在PHP开发中,经常需要存储关键字数组,比如词汇表、标签等等。如何高效地存储这些关键字数组,是PHP开发中的一个重要问题。本文将介绍PHP中常用的几种存储关键字数组的方...
    99+
    2023-08-02
    存储 关键字 数组
  • CSS如何实现模拟position的fixed页面定位效果
    这篇文章主要介绍CSS如何实现模拟position的fixed页面定位效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体实现方法如下:代码如下:<!DOCTYPE html...
    99+
    2024-04-02
  • 如何验证RMAN备份有效性
    小编给大家分享一下如何验证RMAN备份有效性,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! RMAN...
    99+
    2024-04-02
  • js如何实现简单的获取验证码按钮效果
    小编给大家分享一下js如何实现简单的获取验证码按钮效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果图:图(1)初始图图(2)点击后代码如下:<!DOCTYPE HTM...
    99+
    2024-04-02
  • 微信小程序如何实现验证码倒计时效果
    这篇文章主要介绍了微信小程序如何实现验证码倒计时效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序如何实现验证码倒计时效果文章都会有所收获,下面我们一起来看看吧。如果写过js的倒计时,那么小程序中使用...
    99+
    2023-06-30
  • 如何在Python中有效地加载Git关键字?
    在Git中,关键字是指能够在代码中引起注意的词汇或短语。这些关键字包括了一些特殊的命令和参数,能够帮助我们更好地管理代码仓库。在Python中,我们可以通过使用GitPython模块来加载Git关键字,从而实现更加高效的代码管理。下面,我...
    99+
    2023-09-18
    git load 关键字
  • 如何在IDE中高效地使用ASP关键字?
    ASP是一种动态网页开发技术,它允许开发人员将HTML页面与服务器端脚本语言(如VBScript)结合使用,实现动态生成网页的功能。在ASP中,有很多关键字可以帮助开发人员更加高效地完成编码工作。本文将介绍如何在IDE中高效地使用ASP关键...
    99+
    2023-08-25
    关键字 对象 ide
  • javascript如何验证是否为数字
    这篇文章主要介绍了javascript如何验证是否为数字,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 java...
    99+
    2024-04-02
  • 关键字:Java、Windows、编程、算法,如何在实践中获得最佳效果?
    Java作为一种广泛应用于Windows平台上的编程语言,其算法在实践中的应用不仅可以提高编程效率,还可以帮助我们在Windows系统上获得最佳效果。 一、Java在Windows平台上的编程 Java是一种基于面向对象编程思想的高级编程语...
    99+
    2023-08-05
    windows 编程算法 关键字
  • 如何用Python生成字母数字验证码
    本篇文章给大家分享的是有关如何用Python生成字母数字验证码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言我们每次登陆某些网站的时候,它总会有一个模糊且字母加数字的验证码...
    99+
    2023-06-02
  • win8如何关掉网络身份验证
    这篇文章主要介绍win8如何关掉网络身份验证,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在开始按钮或计算机图标上,右击选择打开“计算机管理”。在计算机管理窗口,单击“服务”,在右侧列表中找到“Wired AutoC...
    99+
    2023-06-28
  • laravel中如何关闭验证码功能
    本文小编为大家详细介绍“laravel中如何关闭验证码功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“laravel中如何关闭验证码功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Laravel中的验证码L...
    99+
    2023-07-05
  • 如何优化Limit关键字
    这期内容当中小编将会给大家带来有关如何优化Limit关键字,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  Limit关键字怎么优化  建议一:灵活使用Limit0子句 ...
    99+
    2024-04-02
  • Replace关键字如何使用
    本篇文章为大家展示了Replace关键字如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在sql server中Replace关键字主要是用来将字符...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作