zoukankan      html  css  js  c++  java
  • C#中的Unsafe和Fixed

    托管代码 (managed code):由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动
    垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。 非托管代码(Unmanaged Code):在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支
    持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
    Unsafe的代码介于这两者之间,它也是在CLR的环境中执行,但是我们可以直接操作内存。只要我们的代码包含下面三个指针操作符之一就需要使用Unsafe
    关键字:
    • *
    • &
    • ->

    例如:

    unsafe static void ChangeValue(int* pInt)
        {
            *pInt = 23;
        }

    上面的代码由于是在CLR下托管执行,为了减少内存碎片C#的自动垃圾回收机制会允许已经分配的内存在运行时进行位置调整,所以如果我们多次调用的话就可能
    导致指针指向其他的变量。比如*pInt为指向一个变量的地址为1001,CLR在重新内存整理分配后该变量就存储在地址为5001的地方。而原来1001的地方可能会
    被分配其他变量,要解决这个问题我们就需要使用Fixed关键字。

    fixed 语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。如下面例子:

    using System;
    class CaryData
    {
        public int data;
    }
    
    class CProgram
    {
       
        unsafe static void ChangeValue(int* pInt)
        {
            *pInt = 23;
        }
    
        public unsafe static void Main()
        {
            CaryData cd = new CaryData();
            Console.WriteLine("改变前: {0}", cd.data);        
    
            fixed (int* p = &cd.data)
            {
                ChangeValue(p);
            }
            Console.WriteLine("改变后: {0}", cd.data);
        }
    }

    注意要勾选项目属性中生成标签的允许不安全代码。

     
    http://www.cnblogs.com/carysun/archive/2009/11/07/csharp-unsafe.html
        
  • 相关阅读:
    王爽汇编实验(八)
    王爽汇编实验(七)
    王爽汇编实验(六)
    王爽汇编实验(五)
    计算机操作系统锁机制.
    网页搜索框里显示字段鼠标点击后就隐藏的方法
    织梦删掉会员空间,保留开放会员(禁止注册)的方法
    织梦DEDECMS后台验证码错误不能正常验证的3种可能原因和解决
    织梦DEDECMS后台验证码错误不能正常验证的3种可能原因和解决
    织梦怎么对某些字段信息隐藏,登录后可查看
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/7047649.html
Copyright © 2011-2022 走看看