zoukankan      html  css  js  c++  java
  • 《你不常用的c#之四》:Array的小抽屉ArraySegment

    转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6200060

    一:)略谈
         ArraySegment顾名思义就是Array区块,数组的小抽屉,用于对该数组中元素的范围进行分隔。比如这个数组:

    String[] myArr = { "Overred", "Medloy", "Xiaoguai", "Hare" };  

    我们用ArraySegment这个抽屉给装起来就是:

    ArraySegment<String> arrSeg = new ArraySegment<String>(myArr);  

    只需for一下就可以得出这个小抽屉里的myArr值(不能foreach,ArraySegment无GetEnumerator方法实现)

    for (int i = arrSeg.Offset; i < (arrSeg.Offset + arrSeg.Count); i++)
                {
                    Console.WriteLine("   [{0}] : {1}", i, arrSeg.Array[i]);
                }

    比如我们想取某个区域,可以:

    ArraySegment<String> myArrSegMid = new ArraySegment<String>(myArr, 1, 3);  

    则取myArr的索引从1到3的值。需要注意的是:
           多个 ArraySegment 实例可以引用同一个原始数组,从而可能发生重叠。Array 属性返回整个原始数组,而不是该数组的副本;

    所以:

    arrSeg.Array[2] = "xx";  

    则会导致myArr里的值也发生变化,此时的myArr值则为:

    { "Overred", "Medloy", "xx", "Hare" };  
    二):应用

    应用方面:所以ArraySegment可以用在内存碎片(fragmentation)较多的地方,来减少内存碎片的产生,以便使内存更有序,提高我们的程序性能。比如Socket.BeginReceive异步接收频繁的时候,我们并不知道要接受的这个buffer长度,所以就预先设置一个固定值,这时候这块内存就会被pin住,一直等到网络硬件接收到数据完成为止,这往往比较容易产生碎片,如果你用windbg一看,!DumpHeap -type Free -stat会有很多objects但是值都是0.所以可以用ArraySegment+Stack来解决,我会拿出专门的一节来讲解。

  • 相关阅读:
    数据结构——数据结构的起源和研究内容
    数据结构——学习数据结构的意义
    C++中动态内存申请的结果
    C++中函数异常规格的说明
    C++异常处理的深入理解
    NOIP 2012 Day2
    NOIP 2012 Day1
    NOIP 2011 Day2
    NOIP 2011 Day 1
    NOIP 2010
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3406253.html
Copyright © 2011-2022 走看看