成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析如何驗證fixed關鍵字效果

開發 后端
在這里作者設置了一個小實驗,來驗證fixed關鍵字效果。希望通過本文能對大家有所幫助。

本文主要是一種驗證,對與fixed關鍵字操作的的驗證,希望通過本文能讓大家對fixed關鍵字理解得更深入一些。同時也會分析程序員可能出現問題的一些壞習慣,希望對大家有所幫助。

#T#

之前談到String連接操作的性能,其中會涉及到unsafe操作,而unsafe操作必然會涉及到指針,于是fixed關鍵字也應運而生。fixed關鍵字是用來pin住一個引用地址的,因為我們知道CLR的垃圾收集器會改變某些對象的地址,因此在改變地址之后指向那些對象的引用就要隨之改變。這種改變是對于程序員來說是無意識的,因此在指針操作中是不允許的。否則,我們之前已經保留下的地址,在GC后就無法找到我們所需要的對象。現在就來我們就來做一個小實驗,驗證fixed關鍵字的效果。

當然,這個實驗很簡單,簡單地可能會讓您笑話。首先我們來準備一個SomeClass類:

  1. public class SomeClass  
  2. {  
  3.     public int Field;  

然后準備一段代碼:

  1. private static unsafe void GCOutOfFixedBlock()  
  2. {  
  3.     var a = new int[100];  
  4.     var c = new SomeClass();  
  5.  
  6.     fixed (int* ptr = &c.Field)  
  7.     {  
  8.         PrintAddress("Before GC", (int)ptr);  
  9.     }  
  10.  
  11.     GC.Collect(2);  
  12.  
  13.     fixed (int* ptr = &c.Field)  
  14.     {  
  15.         PrintAddress("After GC", (int)ptr);  
  16.     }  
  17. }  
  18.  
  19. private static void PrintAddress(string name, int address)  
  20. {  
  21.     Console.Write(name + ": 0x");  
  22.     Console.WriteLine(address.ToString("X"));  

在GCOutOfFixedBlock方法中,我們首先分配一個長度為100的int數組,然后新建一個SomeClass對象。新建數組的目的在于制造“垃圾”,目的是在調用GC.Collect方法時改變SomeClass對象在堆中的位置。由于垃圾回收發生在fixed代碼塊之外,這樣我們前后兩次打印出的值便是不同的:

Before GC: 0x1A058C0
After GC: 0x1975DF4

值得注意的是,這段代碼必須在Release模式下進行編譯,讓CLR執行代碼時進行優化,這樣CLR便會在垃圾回收時發現a數組已經是垃圾了(因為后面的代碼不會用它),于是會將其回收——否則便無法看出地址改變的效果來。那么,我們重寫一段代碼:

  1. private static unsafe void GCInsideFixedBlock()  
  2. {  
  3.     var a = new int[100];  
  4.     var c = new SomeClass();  
  5.  
  6.     fixed (int* ptr = &c.Field)  
  7.     {  
  8.         PrintAddress("Before GC", (int)ptr);  
  9.         GC.Collect(2);  
  10.     }  
  11.  
  12.     fixed (int* ptr = &c.Field)  
  13.     {  
  14.         PrintAddress("After GC", (int)ptr);  
  15.     }  

結果如下:

Before GC: 0x1B558C0
After GC: 0x1B558C0

由于GC發生在fixed代碼塊內部,因此c對象被pin在堆上了,于是GC前后c對象的地址沒變,這就是fixed的作用。那么,下面這段代碼運行結果是什么呢?

  1. private static unsafe void Mixed()  
  2. {  
  3.     var a = new int[100];  
  4.     var c1 = new SomeClass();  
  5.     var c2 = new SomeClass();  
  6.  
  7.     fixed (int* ptr1 = &c1.Field)  
  8.     {  
  9.         PrintAddress("Before GC", (int)ptr1);  
  10.     }  
  11.  
  12.     fixed (int* ptr2 = &c2.Field)  
  13.     {  
  14.         PrintAddress("Before GC (fixed)", (int)ptr2);  
  15.         GC.Collect(2);  
  16.     }  
  17.  
  18.     fixed (int* ptr1 = &c1.Field)  
  19.     {  
  20.         PrintAddress("After GC", (int)ptr1);  
  21.     }  
  22.  
  23.     fixed (int* ptr2 = &c2.Field)  
  24.     {  
  25.         PrintAddress("After GC (fixed)", (int)ptr2);  
  26.     }  

至于為什么是這個結果,那便和CLR實現方式有關了。

原文標題:驗證fixed關鍵字效果的小實驗

鏈接:http://www.cnblogs.com/JeffreyZhao/archive/2009/11/29/lab-fixed-keyword.html

責任編輯:彭凡 來源: 博客園
相關推薦

2009-08-13 17:44:34

C# using關鍵字

2009-06-29 12:58:47

This關鍵字java

2010-01-26 14:35:11

C++關鍵字

2012-04-23 13:49:55

PHP技術

2009-11-26 19:24:54

PHP類CMS

2009-08-21 14:58:56

C# this關鍵字

2013-01-30 10:12:14

Pythonyield

2018-04-20 15:56:09

Pythonglobal關鍵字

2009-09-17 09:30:00

Linq LET關鍵字

2022-01-04 16:35:42

C++Protected關鍵字

2012-03-01 12:50:03

Java

2009-09-02 09:24:03

C# this關鍵字

2019-12-20 15:19:41

Synchroinze線程安全

2009-12-17 13:57:15

Ruby關鍵字

2009-08-06 17:52:23

C#增加that關鍵字

2009-08-26 15:16:29

C# lock關鍵字

2024-03-15 15:12:27

關鍵字底層代碼

2011-06-14 13:26:27

volatile

2009-08-21 14:47:59

C# base關鍵字

2021-08-06 07:51:47

關鍵字int函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产电影 | 免费观看羞羞视频网站 | 国产成人久久精品一区二区三区 | 亚洲一区二区三区在线免费观看 | 久久久久久影院 | 国产欧美精品一区 | 国产乱码精品一区二区三区忘忧草 | 亚洲精品中文在线观看 | 天天操综合网站 | 日韩中文字幕在线视频 | .国产精品成人自产拍在线观看6 | 久草在线| 91精品久久久久久久久99蜜臂 | 欧美亚洲国产日韩 | 国产欧美精品一区二区三区 | 精品久久久久久亚洲精品 | 精品一区久久 | 欧美精品二区三区 | 日韩精品一区二区三区在线播放 | 亚洲午夜视频在线观看 | 91久久精品国产91久久 | 在线观看视频91 | 久久久久久久久久性 | 日韩中文字幕在线播放 | h视频在线看 | 日本免费视频在线观看 | 欧美激情一区二区三区 | 国产小视频在线看 | 精品一区电影 | 韩国主播午夜大尺度福利 | 午夜精品一区二区三区免费视频 | 久操福利 | 精品成人 | xxxxx黄色片| 久久成人免费观看 | av黄色在线| 夜夜精品浪潮av一区二区三区 | 在线高清免费观看视频 | 国产亚洲精品成人av久久ww | 精品久久久久久久久久久院品网 | 免费在线视频精品 |