<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      happyhippy

      這個世界的問題在于聰明人充滿疑惑,而傻子們堅信不疑。--羅素
      ((原文發表于CSDN我的Blog:http://blog.csdn.net/happyhippy/archive/2006/10/29/1356088.aspx
      先看下Reflector.exe反匯編.net framework 2.0中Mscorlid.dll,得到String.ToCharArray ()源碼:
      //.net framework 2.0
      public unsafe char[] ToCharArray()
      {
            
      int num1 = this.Length;
            
      char[] chArray1 = new char[num1];
            
      if (num1 > 0)
            
      {
                  
      fixed (char* chRef1 = &this.m_firstChar)
                  
      {
                     
      //使用fixed,防止gc執行垃圾回收后移動堆上的對象而造成無效指針
                        fixed (char* chRef2 = chArray1)
                        
      {
                              
      string.wstrcpyPtrAligned(chRef2, chRef1, num1);
                              chRef1 
      = null;
                        }

                  }

            }

            
      return chArray1;
      }


      private static unsafe void wstrcpyPtrAligned(char* dmem, char* smem, int charCount)
      {
            
      while (charCount >= 8)//四重展開
            {
                  
      *((int*) dmem) = *((uint*) smem); //拷貝32bit
                  *((int*) (dmem + 2)) = *((uint*) (smem + 2));
                  
      *((int*) (dmem + 4)) = *((uint*) (smem + 4));
                  
      *((int*) (dmem + 6)) = *((uint*) (smem + 6));
                  dmem 
      += 8;
                  smem 
      += 8;
                  charCount 
      -= 8;
            }

            
      if ((charCount & 4!= 0)
            
      {
                  
      *((int*) dmem) = *((uint*) smem);
                  
      *((int*) (dmem + 2)) = *((uint*) (smem + 2));
                  dmem 
      += 4;
                  smem 
      += 4;
            }

            
      if ((charCount & 2!= 0)
            
      {
                  
      *((int*) dmem) = *((uint*) smem);
                  dmem 
      += 2;
                  smem 
      += 2;
            }

            
      if ((charCount & 1!= 0)
            
      {
                  dmem[
      0= smem[0];
            }

      }

            ToCharArray中使用了fixed來防止gc執行垃圾回收后移動托管堆上的對象。托管堆的工作方式類似于棧,在某種程度上,連續的對象會在內存緊挨的位置放置,這樣很容易使用指向下一個空閑存儲單元的堆指針,來確定下一個對象的位置。在gc回收不再引用的對象所占用的內存后,現存對象在內存的位置可能不再連續,此時gc會把所有對象移動到托管堆的端部,在次形成一個連續的塊。當然,在移動對象時,這些對象的所有引用都需要用正確的新地址來更新。gc的這個壓縮操作時托管的堆與非托管堆的區別所在。使用托管堆,就只需要讀取堆指針的值即可,而不是搜索鏈接地址列表,來查找一個地方放置新對象。因此在.net下實例化對象要快得多。
            使用了fixed后,在fixed塊語句內指針所指向的對象將不會在托管堆上移動,從而保證wstrcpyPtrAligned方法中的指正都指向正確的內存地址。

       

      wstrcpyPtrAligned方法中也用幾點內存優化技巧(《代碼優化規則》摘錄了更多的技巧):
      1.   *((int*) targetAddress) = *((uint*) originalAddress);
              將執行char的指針轉換成指向int/uint的指針,從而實現每次讀取32bit的數據。


      2.   while (charCount >= 8){}
              按四重展開循環。流水線型CPU對分支語句表現出過度敏感,從而降低了分支語句的執行速度(循環語句也是一種分支語句)。可以把CPU比作賽跑選手,把代碼比作跑道,選手會在每個彎道(分支語句)處減速。循環展開有助于減少分支,從而減少運行時間。一般按4/8/16重展開,再繼續展開的話,優化效果可以忽略,而書寫的代碼量大,CPU的Cache也容不下這個龐然大物。--《代碼優化:有效使用內存》


      3.   *((int*) dmem) = *((uint*) smem);
             *((int*) (dmem + 2)) = *((uint*) (smem + 2));
             *((int*) (dmem + 4)) = *((uint*) (smem + 4));
             *((int*) (dmem + 6)) = *((uint*) (smem + 6));
             dmem += 8;
             smem += 8;
      前面四條語句都是根據dmen/smen+X來定位地址,消除了語句之間的數據相關性。如果寫成下面這樣:
      *((int*) dmem) = *((uint*) smem);
      dmem += 2; smem += 2;
      *((int*) dmem) = *((uint*) smem);
      dmem += 2; smem += 2;
      *((int*) dmem) = *((uint*) smem);
      dmem += 2; smem += 2;
      *((int*) dmem) = *((uint*) smem);
      dmem += 2; smem += 2;
      這種寫法不但增加了代碼量,而且還降低了指令執行的并發度。

       

      另外,.net framework 1.1中的ToCharArray()的實現與2.0版本中的有所不同,下面是ToCharArray方法的源碼:

      //.net framework 1.1
      public char[] ToCharArray()
      {
            
      return this.ToCharArray(0this.Length);
      }


      public char[] ToCharArray(int startIndex, int length)
      {
            
      if (((startIndex < 0|| (startIndex > this.Length)) || (startIndex > (this.Length - length)))
            
      {
                  
      throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index"));
            }

            
      if (length < 0)
            
      {
                  
      throw new ArgumentOutOfRangeException("length", Environment.GetResourceString("ArgumentOutOfRange_Index"));
            }

            
      char[] chArray1 = new char[length];
            
      this.InternalCopyTo(startIndex, chArray1, 0, length);
            
      return chArray1;
      }


      [MethodImpl(MethodImplOptions.InternalCall)]
      internal extern void InternalCopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);

      posted on 2006-12-23 11:09  Silent Void  閱讀(1405)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 无码天堂亚洲国产av麻豆| 精品无码成人片一区二区| 爆乳女仆高潮在线观看| 久久久久人妻精品一区三寸 | 欧美乱码伦视频免费| 国产成年码av片在线观看| 蜜桃网址| 亚洲不卡一区三区三区四| 99久久精品国产一区二区蜜芽| 亚洲一区二区三区蜜桃臀| 太和县| 日韩伦理片一区二区三区| 亚洲国产美女精品久久久 | 女人喷液抽搐高潮视频| 天堂а√在线最新版中文在线| 99久久免费精品色老| 日本狂喷奶水在线播放212| 日产国产精品亚洲系列| 民丰县| 九九在线精品国产| 久久亚洲精品成人综合网| 波多野无码中文字幕av专区| 亚洲av无码之国产精品网址蜜芽| 农村老熟女一区二区三区| 欧美性大战久久久久久| 变态另类视频一区二区三区| 亚洲精品韩国一区二区| 大港区| 亚洲熟女乱色综合亚洲图片| 在线天堂最新版资源| 国产亚洲无线码一区二区| 这里只有精品在线播放| 大尺度国产一区二区视频| 英超| 国产在线一区二区不卡| 国产亚洲一区二区三不卡| 亚洲精品有码在线观看| 18禁黄无遮挡网站免费| 康马县| 少妇熟女久久综合网色欲| 久久国产精品波多野结衣|