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

msdn里讲到:

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

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

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

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

还是msdn上的demo:

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

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

《你不常用的c#之一》:略谈unsafe的更多相关文章

  1. 《你不常用的c#之二》:略谈GCHandle

    我们在使用c#托管代码时,内存地址和GC回收那不是我们关心的,CLR已经给我们暗箱操作.但是如果我们在c#中调用了一个非托管代码,比如vc的DLL,而且他有个回调函数,需要引用c#中的某个对象并操作, ...

  2. 略谈Android之Intent

    前言:大家都知道Android程序的实现一般都由四大组件构成: Activity :Android程序实现功能的主体,提供了和客户交互的界面,也提供了和后台交互的功能. Service :是一个没有界 ...

  3. 略谈cpu架构种类

    一直对x86/i386/i686/x86_64这些东西感觉很不清楚,查些资料,解决部分问题,小记一番. Question1:什么是x86? x86或80x86是英特尔Intel首先开发制造的一种微处理 ...

  4. 55. 略谈Lotus Notes的与众不同及系列文章至此的总结

    在二十多年的悠久历史里,Lotus Notes发展出一整套独特的概念.技术和思维.由于它早期惊人的领先时代和后续发展中同样惊人的忠于传统,这位软件领域的寿星在如今发展更新速度远超往日和技术愈趋公开互通 ...

  5. 【运维】略谈Raid级别

    *何为Raid?          Raid就是磁盘阵列(Redundant Arrays of Independent Disks,RAID),有"独立磁盘构成的具有冗余能力的阵列&quo ...

  6. cookie与session(略谈)

    cookie (储存在用户本地终端上的数据) Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义 ...

  7. JQuery 优缺点略谈

    1.jQuery实现脚本与页面的分离 ; 2.最少的代码做最多的事情; 3.性能; 在大型JavaScript框架中,jQuery对性能的理解最好.尽管不同版本拥有众多新功能,其最精简版本只有18KB ...

  8. 《你不常用的c#之XX》

    你不常用的c#之一>:略谈unsafe http://blog.csdn.net/robingaoxb/article/details/6199508 <你不常用的c#之二>:略谈G ...

  9. [小北De编程手记] : Lesson 05 玩转 xUnit.Net 之 从Assert谈UT框架实践

    这一篇,本文会介绍一下基本的断言概念,但重点会放在企业级单元测试的相关功能上面.下面来跟大家分享一下xUnit.Net的断言,主要涉及到以下内容: 关于断言的概念 xUnit.Net常用的断言 关于单 ...

随机推荐

  1. Centos6.5 安装Vim7.4

    系统本身会带Vim7.2都版本,其实也够用,强迫症患者可以按以下操作升级成Vim7.4: (1)切换到root权限 (2)卸载 rpm -qa | grep vim yum remove vim vi ...

  2. mybatis源码分析(2)——事务概述

    这篇文章主要对mybatis中的事务做一简单的分析,帮助读者理清一些概念. 先来看看在JAVA事务的相关技术,在JAVA中有两类事务,JDBC事务和JTA事务,如果是JDBC类型的事务,则是由Conn ...

  3. CSS中背景图片定位方法

    转自:http://www.ruanyifeng.com/blog/2008/05/css_background_image_positioning.html 作者: 阮一峰 日期: 2008年5月 ...

  4. HDOJ/HDU 1161 Eddy's mistakes(大写字母转换成小写字母)

    Problem Description Eddy usually writes articles ,but he likes mixing the English letter uses, for e ...

  5. 在CentOS上为DiscuzX3安装ImageMagick支持。

    找了几篇外文的,写的很好,按照参考安装成功! http://www.tecmint.com/install-imagemagick-in-linux/ ImageMagick is an free o ...

  6. JavaScript高级程序设计55.pdf

    输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...

  7. jvm参数优化

    一.HotSpot JVM 提供了三类参数 现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色.例如:自适应内存管理.垃圾收集.及时编译.动态类加载.锁优化等.虽然有 ...

  8. Tyvj P3119 核电站问题 动态规划

    题目:http://tyvj.cn/p/3119 P3119 核电站问题 时间: 1000ms / 空间: 65536KiB / Java类名: Main 描述 一个核电站有N个放核物质的坑,坑排列在 ...

  9. 理解事件捕获。在限制范围内拖拽div+吸附+事件捕获

    一.实现的效果是在限制范围内拖拽div+吸附+事件捕获. 这里需要理解的是事件捕获,这个事件捕获也是为了兼容div在拖拽过程中,文本不被选中这个问题. 如此良辰美景,拖拽也可以很洒脱哈.先看看图, 二 ...

  10. 今日又遇无法启动apache

    前几天安装了.NET要用到的MSSERVER,之后apache就running none of service. 把微软的MSSERVER停用掉服务就没问题.哪部分冲突了