zoukankan      html  css  js  c++  java
  • 《你不常用的c#之一》:略谈unsafe

    转自csdn: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来跟你处理,它寻根寻址还得点时候呢。。。。。

  • 相关阅读:
    SPOJ 694 (后缀数组) Distinct Substrings
    POJ 2774 (后缀数组 最长公共字串) Long Long Message
    POJ 3693 (后缀数组) Maximum repetition substring
    POJ 3261 (后缀数组 二分) Milk Patterns
    UVa 1149 (贪心) Bin Packing
    UVa 12206 (字符串哈希) Stammering Aliens
    UVa 11210 (DFS) Chinese Mahjong
    UVa (BFS) The Monocycle
    UVa 11624 (BFS) Fire!
    HDU 3032 (Nim博弈变形) Nim or not Nim?
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3394412.html
Copyright © 2011-2022 走看看