博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET对象占内存多少
阅读量:5038 次
发布时间:2019-06-12

本文共 1459 字,大约阅读时间需要 4 分钟。

一直有一个小小的疑惑——.NET一个对象或者一个集合占多少内存?有没有很快速的方法获取,而不是简单的估计分析对象大小?

查了MSDN,和一些其他人的分析,得到解决是托管代码对象的大小无法真实的得到,因为存在托管对象转化成非托管的CLR优化。但我仍然不死心,非要弄个究竟!好吧,最终得到一些结果了。

 sizeof关键字,用于获取值类型的大小,如int(占4个字节),char(2个字节);并且sizeof 运算符仅适用于值类型,而不适用于引用类型。所以针对对象改关键字无法使用。

查阅msdn,发现对象Marshal.SizeOf 方法,解释为返回类的非托管大小;但是仍然不能使用,因为针对的是非托管代码,如果直接使用一个类的对象,会报一个错误:"不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。";这是因为对象在内存中实际大小并不是固定的,可能这次运行一个值,下次就是另外一个值了,存在优化!

所以为了固定一个对象的大小,必须告诉CLR不优化对象在内存中的大小。这就需要在声明类的时候加上[StructLayout(LayoutKind.Sequential)]这个特性;

StructLayoutAttribute 类使用户可以控制类或结构的数据字段的物理布局。

LayoutKind 枚举  控制当导出到非托管代码时对象的布局。

成员名称 说明
Sequential 对象的成员按照它们在被导出到非托管内存时出现的顺序依次布局。这些成员根据在 StructLayoutAttribute..::.Pack 中指定的封装进行布局,并且可以是不连续的。
Explicit 对象的各个成员在非托管内存中的精确位置被显式控制。每个成员必须使用 FieldOffsetAttribute 指示该字段在类型中的位置。
Auto 运行库自动为非托管内存中的对象的成员选择适当的布局。使用此枚举成员定义的对象不能在托管代码的外部公开。尝试这样做将引发异常。

这就是控制对象转化为非托管代码时占用内存固定,这样我们就可以舒服的使用Marshal.SizeOf方法了。得到一个对象的大小。如果一个对象中还包含另外一个对象,那么另外一个对象可以使用这个[StructLayout(LayoutKind.Sequential)]也可以不使用,如果使用则是,该对象的大小加上这个对象的大小;如果不使用则是该对象的大小加上4个字节(就是这个对象引用大小)。

当想获取一个集合的大小时候,我们不能在List上加这个属性,因为微软的dll中的类,那么我们怎么样才能获取对应的大小呢?其实还用一种简单的方式,就是将对象或者集合转化成内存流,再获取内存流的大小就ok了,虽然有一些其他影响大小,但基本上可以正确的粗略估计一个对象在内存的大小或者比较俩个对象、集合的大小的!

主要代码:

BinaryFormatter binaryFormatter = new BinaryFormatter();MemoryStream stream = new MemoryStream();binaryFormatter.Serialize(stream, personList);stream.Seek(0, SeekOrigin.Begin);

其实里面东西多着的,我仅仅了解了一点点,分享一下,大家一起讨论一下,如果有错误,请批评指出!

转载于:https://www.cnblogs.com/hengxinyi/p/3172910.html

你可能感兴趣的文章
智能电视系列(4)-高通,天才与极限
查看>>
让entityframework.extend库同时支持mysql,sqlsever
查看>>
hdoj:2061
查看>>
Oarcle 入门之like关键字
查看>>
Entity Framework Code First (七)空间数据类型 Spatial Data Types
查看>>
2012年度读写Excel文件的最佳PHP类库收集
查看>>
读过的书
查看>>
ll 详解
查看>>
form表单中的label标签
查看>>
eclipse下解决明明有jar包,却找不到的问题
查看>>
Entity Framework 学习初级篇1--EF基本概况(入门)
查看>>
C Looooops
查看>>
bzoj 2226 LCMSum 欧拉函数
查看>>
JavaSript模块规范 - AMD规范与CMD规范介绍
查看>>
都市环游
查看>>
【工具】【截图工具】FScapture,支持滚动
查看>>
jQuery延迟加载(懒加载)插件 – jquery.lazyload.js
查看>>
人脸检测(1)——HOG特征
查看>>
react native 示例代码
查看>>
关于V1.6.0版本的项目总结
查看>>