• 《你不常用的c#之一》:略谈unsafe


    http://blog.csdn.net/robingaoxb/article/details/6199508

    msdn里讲到:

    “在 C# 中很少需要使用指针,但仍有一些需要使用的情况。例如,在下列情况中使用允许采用指针的不安全上下文是正确的:

    • 处理磁盘上的现有结构
    • 涉及内部包含指针的结构的高级 COM 或平台调用方案
    • 性能关键代码

    对于第一和第二点,主要是调win32的api。
    但是“性能关键代码”这个非常重要。我来举例引申一下。

    我们都知道像飞信这种大型IM服务端,难免会面临大量的字符处理(协议报文)。
    如果同时在线100多万,而且大家都同时进行会话,服务端的程序如果对内存回收不好,那肯定会crash.
    飞信服务端是.net的,所以就拉扯一下这个例子。
    不过你可以大胆猜测,它服务端肯定用了unsafe,不然顶不住这档子活!!

    还是msdn上的demo:

    以下示例使用指针将一个字节数组从 src 复制到 dst。用 /unsafe 选项编译此示例。

    [c-sharp] view plaincopy
     
    1. // fastcopy.cs  
    2. // compile with: /unsafe  
    3. using System;  
    4. class Test  
    5. {  
    6. // The unsafe keyword allows pointers to be used within  
    7. // the following method:  
    8. static unsafe void Copy(byte[] src, int srcIndex,  
    9. byte[] dst, int dstIndex, int count)  
    10. {  
    11. if (src == null || srcIndex < 0 ||  
    12. dst == null || dstIndex < 0 || count < 0)  
    13. {  
    14. throw new ArgumentException();  
    15. }  
    16. int srcLen = src.Length;  
    17. int dstLen = dst.Length;  
    18. if (srcLen - srcIndex < count ||  
    19. dstLen - dstIndex < count)  
    20. {  
    21. throw new ArgumentException();  
    22. }  
    23. // The following fixed statement pins the location of  
    24. // the src and dst objects in memory so that they will  
    25. // not be moved by garbage collection.  
    26. fixed (byte* pSrc = src, pDst = dst)  
    27. {  
    28. byte* ps = pSrc;  
    29. byte* pd = pDst;  
    30. // Loop over the count in blocks of 4 bytes, copying an  
    31. // integer (4 bytes) at a time:  
    32. for (int n =0 ; n < count/4 ; n++)  
    33. {  
    34. *((int*)pd) = *((int*)ps);  
    35. pd += 4;  
    36. ps += 4;  
    37. }  
    38. // Complete the copy by moving any bytes that weren’t  
    39. // moved in blocks of 4:  
    40. for (int n =0; n < count%4; n++)  
    41. {  
    42. *pd = *ps;  
    43. pd++;  
    44. ps++;  
    45. }  
    46. }  
    47. }  
    48. static void Main(string[] args)  
    49. {  
    50. byte[] a = new byte[100];  
    51. byte[] b = new byte[100];  
    52. for(int i=0; i<100; ++i)  
    53. a[i] = (byte)i;  
    54. Copy(a, 0, b, 0, 100);  
    55. Console.WriteLine(”The first 10 elements are:”);  
    56. for(int i=0; i<10; ++i)  
    57. Console.Write(b[i] + ” “);  
    58. Console.WriteLine(”/n”);  
    59. }  
    60. }  

     

    请注意使用了 unsafe 关键字,这允许在 Copy 方法内使用指针。
    fixed 语句用于声明指向源和目标数组的指针。它锁定 src 和 dst 对象在内存中的位置以便使其不会被垃圾回收移动。当 fixed 块完成后,这些对象将被解除锁定。
    通过略过数组界限检查,不安全代码可提高性能。

    fixed 语句允许您获取指向字节数组使用的内存的指针,并且标记实例,以便垃圾回收器不会移动它。

    在 fixed 块的末尾,将标记该实例以便可以移动它。此功能称为声明式锁定。锁定的好处是系统开销非常小,除非在 fixed 块中发生垃圾回收(但此情况不太可能发生)。

    对头,fixed 内我只分配我自己的内存,用完就释放,从不霸占平民土地,不多征收平民余粮!!
    对于如果你要是等着GC来跟你处理,它寻根寻址还得点时候呢。。。。。

  • 相关阅读:
    Java自学-数组 创建数组
    Java自学-控制流程 结束外部循环
    Java自学-控制流程 break
    Java自学-控制流程 for
    Java自学-控制流程 continue
    Java自学-控制流程 switch
    Java自学-控制流程 If
    计算机组成原理之流水线处理器
    计算机组成原理之算术逻辑单元
    计算机组成原理之指令系统
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/4938808.html
Copyright © 2020-2023  润新知