C#中对内存的操作
来源:互联网 发布:正弦 算法 c 编辑:程序博客网 时间:2024/06/11 11:27
本文供自己学习,积累经验使用。
向内存读写数据
类名:Marshal
对非托管内存进行操作控制
通用方法:
byte ReadByte(IntPtr address);//读取指定句柄所代表内存处的内容
void WriteByte(IntPtr address,byte b);//向指定句柄所代表内存地址address处写入一个b。
代码:
byte b = Marshal.ReadByte(address1+5772);//读取指定内存的方法。 Marshal.WriteByte(address2, 109);
得到内存句柄
结构体:GCHandle
从非托管内存访问托管对象的方法
通用方法:
GCHandle Alloc(object value,GCHandleType type)//为指定对象分配指定类型的句柄
GCHandleType为枚举类型,取值为:
Weak = 0; //此句柄类型用于跟踪对象,但允许回收该对象
WeakTrackResurrection = 1; //该句柄类型类似于 System.Runtime.InteropServices.GCHandleType.Weak,但如果对象在终结过程中复活,此句柄不归零。
Normal = 2; //此句柄类型表示不透明句柄,这意味着无法通过此句柄解析固定对象的地址。可以使用此类型跟踪对象,并防止它被垃圾回收器回收。当非托管客户端持有对托管对象的唯一引用(从垃圾回收器检测不到该引用)时,此枚举成员很有用。
Pinned = 3; (常用) //此句柄类型类似于 System.Runtime.InteropServices.GCHandleType.Normal,但允许使用固定对象的地址。这将防止垃圾回收器移动对象,因此将降低垃圾回收器的效率。使用System.Runtime.InteropServices.GCHandle.Free() 方法可尽快释放已分配的句柄。
IntPtr AddrOfPinnedObject();//返回检索对象的地址
代码:
string str = "hello";GCHandle h = GCHandle.Alloc(str, GCHandleType.Pinned);IntPtr address1 = h.AddrOfPinnedObject();Console.WriteLine("straddress:" + address1+str);
总结
对地址的理解,能够帮助我对程序的深层次理解。对内存的操作,方便对内存基理的理解。
帮助文档
1、Msdn
2、vs2013 函数注释
- C#中对内存的操作
- .C#可否对内存进行直接的操作
- C#可否对内存进行直接的操作
- C#可否对内存进行直接的操作
- C#_对内存的操作(转)
- kernel中对内存的物理表示
- 对内存中存储区域的再认识
- QT中对内存的管理
- C#是否可以对内存直接进行操作?
- 对内存的认识
- 对内存的理解
- 对内存的思考
- 对内存的优化
- 通过实例谈C#对象对内存的使用
- C++编程语言对内存的操作指南
- JS中关于对内存的释放问题[待续]
- 在实际编程中对内存的优化
- 在Qt程序中对内存管理的建议
- 大数之加法提高版应用
- JVM的内存区域划分
- 观点摘录: 李笑来理财文章(by 星空武哥)
- jQuery选择器探究:语法汇总
- Netbeans Theme
- C#中对内存的操作
- BeagleBoneBlack学习(4)——UBuntu14.04下配置TFTP服务器与NFS服务器
- 跑马灯marquee的用法
- 查看CentOS版本方法
- 怎么学习制作虚拟币,学习途径是什么?
- OpenCV坐标体系的初步认识
- ubuntu下修改mysql编码格式的问题
- sdau-2 1012
- Caffe实战系列:如何将CRFAsRNN移植到caffe-windows上去