(转载)关于C#的fixed
语言:c#,c
前提知识:
1.指针集成开发环境:Visual Studio 2017
此下为MSDN原文:
fixed 语句可防止垃圾回收器重新定位可移动的变量。fixed 语句仅允许存在于不安全的上下文中。fixed 还可用于创建固定大小的缓冲区。
实际这个关键字是为了兼容c的指针而存在的,fixed仅可用在不安全(unsaved)的上下文中为何需要使用fixed呢,因为这跟c#的GC(garbage collection)有关,C#的GC不仅仅是回收不使用的内存,它还会进行内存压缩,而这个内存压缩便是fixed的存在意义,因为每当进行GC,将会有大大小小的内存零零散散的被释放,因而产生许多内存碎片,当分配较大内存时这些碎片无法用上只能等待适合它们的内存分配请求,所以GC会进行内存压缩,当查找到较大的内存空间就会将标记的(还在使用的)对象的内存移到这个内存空间里,这样卡在标记对象内存之间的碎片就能重新合成一个大的内存空间方便下一次分配。
当然标记对象的内存移动了它的引用会进行重定位,而指针却不会,因为指针只是耿直地记下内存的地址,一旦对象被重定位,指针就会变成一个野指针,多么可怕,所以才需要fixed固化内存,被fixed标记的变量或是固定大小的内存块将不会被进行重定位直到退出fixed上下文。
下面在补充一下:需要初始化指针来固化内存,需要在fixed语句中初始化指针像这样:
fixed(T *p=&t)
{…}
如果需要初始化多个相同类型的指针,可以在同一个语句中初始化多个指针:像这样:
fixed(T *p=&t,*p1=&t2)
{…}
要是需要初始化多个不同类型的指针,可以使用嵌套像这样:
fixed(T *p=&t)
{ fixed(T2 *p1=&t2) { … }}
需要注意的是,fixed语句中初始化的指针是只读变量,就是指针常量无法修改,要是想要修改它只能声明另一个指针,通过这个指针去修改。像这样:
fixed(T *p=&t)
{
p++;//Error
T *p2=p;
p2++;//ok
}
另外,在不安全模式中堆栈中的内存不受垃圾回收管理所以不需要固定。
总结一下:c#中指向堆内存的指针必须在unsaved和fixed的上下文中使用。
作者:七_8f69
链接:https://www.jianshu.com/p/c6e500c9d481來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
(转载)关于C#的fixed相关推荐
- 修正IE6中FIXED不能用的办法,转载
.fixed-top /* 头部固定 */{position:fixed;bottom:auto;top:0px;} .fixed-bottom /* 底部固定 */{position:fixed;b ...
- 锁定表头和固定列(Fixed table head and columns)(转载)
前段时间需要这个功能,但是找了很多都不能完美的实现,不是只能锁定表头,就是浏览器兼容问题什么的,在此就自己做了一个锁定表头和列的js方法,依赖于JQuery. 因为方法很简单,就未封装成插件的形式,仅 ...
- 使用属性position:fixed的时候如何才能让div居中
css: .aa { position: fixed; top: 200px; left: 0px; right: 0px; width: 200px; height: 200px; margin-l ...
- CSS中position属性( absolute | relative | static | fixed )详解
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...
- jquery实现返回顶部按钮和scroll滚动功能[带动画效果] 转载
转载自:老驴的博客 jQuery脚本: 1 <script type="text/javascript">2$(function() {3 var scrollDiv ...
- html百度转到顶部 fixed,科技常识:完美解决安卓端百度浏览器屏蔽fixed悬浮元素的问题...
今天小编跟大家讲解下有关完美解决安卓端百度浏览器屏蔽fixed悬浮元素的问题 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关完美解决安卓端百度浏览器屏蔽fixed悬浮元素的问题 的相关资料 ...
- setprecision、fixed、showpoint的用法总结(经典!!超经典!!)【转】
本文转载自:http://blog.csdn.net/u011321546/article/details/9293547 首先要加头文件:iomanip 一:setprecision 作用:控制输出 ...
- js基础到精通全面教程--JS教程(转载)--推荐
基础知识:HTML JavaScript就这么回事1:基础知识 1 创建脚本块 1: <script language="JavaScript"> 2: JavaS ...
- css 兼容ie6,ie7,ff的fixed,元素上下端固定定位方法
2019独角兽企业重金招聘Python工程师标准>>> <style type="text/css"> body{ background-image: ...
最新文章
- 技术图文:Python 位运算防坑指南
- tar 解压缩命令详解
- 【任务脚本】双十一将至,任务脚本预热,OrangeJs基于autojs全自动程序,向大神致敬...
- dr优先级默认_OSPF中的DR/BDR的选取规则:DR优先级,Router ID
- ida导入jni头文件_IDA动态调试无法导入JNI文件的解决办法
- 记一次node+react项目发布过程(一)--webpack生产环境打包优化
- 嵌入式工程师开发工作主要做些什么,以后收入怎样
- ML/DL-复习笔记【十】- 分组卷积和深度可分离卷积的区别
- python-学生管理系统--9-整体代码
- CNN 解析 --唐宇迪
- 网上书店销售管理系统java_网上书店销售管理系统的设计与实现(JSP,SQLServer)
- Editplus激活码
- LayaBox---Dialog弹窗
- 51单片机非阻塞串口中断收发数据
- linux考试题100道
- android su程序分析
- 用python做个聊天机器人与群发助手~再也不怕没时间回女友,闺蜜被胖揍了~
- 网站流量分析的整体思路(大数据)
- 浏览器主页被hao123等篡改解决方法
- 尚硅谷周阳老师2020最新Springcloud完整版学习