当前位置: 首页 > news >正文

《你不常用的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 plain copy
 
  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来跟你处理,它寻根寻址还得点时候呢。。。。。

转载于:https://www.cnblogs.com/zhaox583132460/p/3394412.html

相关文章:

  • JNI的method映射对应表
  • Visual Studio 2008 使用 WinCE 5.0 Emulator
  • 每日英语:How Often Do Gamblers Really Win?
  • core--线程状态
  • 纵向二级列表
  • 转:windows xp下如何安装SQL server2000企业版
  • XCode 调试方法 (很全 很有用)
  • C#遍历DataSet中数据的几种方法总结
  • C#中巧用#if DEBUG 进行调试
  • [1] 平面(Plane)图形的生成算法
  • 参数传递可选参数
  • Boosting 和梯度Boosting
  • 简单的javascript实例二(随页面滚动广告效果)
  • Android Studio 导入外部lib文件
  • HashMap和HashSet的区别
  • 时间复杂度分析经典问题——最大子序列和
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • co模块的前端实现
  • Fabric架构演变之路
  • JAVA 学习IO流
  • Phpstorm怎样批量删除空行?
  • redis学习笔记(三):列表、集合、有序集合
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • spring cloud gateway 源码解析(4)跨域问题处理
  • TypeScript实现数据结构(一)栈,队列,链表
  • vuex 笔记整理
  • 给github项目添加CI badge
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 利用jquery编写加法运算验证码
  • 两列自适应布局方案整理
  • 前端学习笔记之观察者模式
  • 区块链将重新定义世界
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 手写一个CommonJS打包工具(一)
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​马来语翻译中文去哪比较好?
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (Python) SOAP Web Service (HTTP POST)
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • ******之网络***——物理***
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net wcf memory gates checking failed
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET使用存储过程实现对数据库的增删改查
  • .NET序列化 serializable,反序列化
  • @RequestMapping用法详解