中易网

.NET对象占内存多少

答案:2  悬赏:70  
解决时间 2021-12-31 02:06
.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了,虽然有一些其他影响大小,但基本上可以正确的粗略估计一个对象在内存的大小或者比较俩个对象、集合的大小的!
全部回答
我可以帮你。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
垣曲县公安局城西派出所办公地址在什么地方,
探捕的意思是什么啊?请解释下!
求一歌曲,念念不忘,电视剧《神捕十三娘》
鍊字的意思是什么?鍊字的释义是什么啊?
深圳到九寨沟圆通快递大约几天
临猗县牛杜派出所办公地址在什么地方,我要处
想在微信上筹款,爱心筹有用吗?谁能说说?
特等的意思是什么?特等的释义是什么啊?
解州派出所地址有知道的么?有点事想过去!
庐庑的意思是什么啊?请解释下!
阴历中的24节气都在时间?
Tenny是男名还是女名? 这个名字好吗? 如果不
北城派出所(运城市商务执法大队西南)地址在什
禅经的意思是什么?禅经的释义是什么啊?
金昌网吧怎么去啊,有事要去办理
推荐资讯
無柰的意思是什么?無柰的释义是什么啊?
时间学的意思是什么啊?请解释下!
BLUECOFFEE地址在哪,我要去那里办事
一秉虔誠的意思是什么?一秉虔誠的释义是什么
水晶花造花液是否有毒
晦藏的意思是什么?晦藏的释义是什么啊?
半边的意思是什么?半边的释义是什么啊?
云旅的意思是什么?云旅的释义是什么啊?
qq表情太大怎么调
所止的意思是什么?所止的释义是什么啊?
過曲的意思是什么?過曲的释义是什么啊?
构虐的意思是什么啊?请解释下!
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?