首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >找出.NET对象的大小

找出.NET对象的大小
EN

Stack Overflow用户
提问于 2008-11-27 23:38:11
回答 4查看 53.6K关注 0票数 56

我正在尝试找出我的对象占用了多少内存,以查看它们中有多少最终存储在Large Object Heap上(超过85,000字节的任何内容)。

这是不是很简单,只需为int添加4,为long添加8,为每个对象的引用类型等添加4(如果是64位,则为8),或者是否存在方法、属性等的开销?

EN

回答 4

Stack Overflow用户

发布于 2011-07-05 17:36:47

如果你可以-序列化它!

代码语言:javascript
复制
Dim myObjectSize As Long

Dim ms As New IO.MemoryStream
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(ms, myObject)
myObjectSize = ms.Position
票数 11
EN

Stack Overflow用户

发布于 2008-11-28 01:46:42

您正在进入一个高级.NET调试领域。从John Robins debugging books开始。

WinDBG与Sos.dll ( .NET发行版的一部分)和Sosex.dll扩展一起使用。使用这些工具,您可以真正了解应用程序运行时发生的情况。你会找到上述问题的答案。

(另一个建议是安装Shared Source CLI 2.0,也就是。转子2,看看引擎盖下发生了什么。)

票数 9
EN

Stack Overflow用户

发布于 2008-11-27 15:57:50

除非它是一个巨大的值类型或实例类型(即数千个字段),否则您需要担心的唯一类型是大型数组或字符串。当然,要计算出数组的大小,需要知道元素的大小。

.NET (目前)对齐类型的方式与本机编译器对齐类型的方式非常相似。基本类型具有自然对齐,通常是与其大小最接近的两个整数的四舍五入整数幂:

代码语言:javascript
复制
Single, Int32, UInt32 - 4
IntPtr, UIntPtr, pointers, references  - 4 on 32-bit, 8 on 64-bit
Double, Int64, UInt64 - 8
Char, Int16, UInt16   - 2
Byte, SByte           - 1

当汇编类型时,编译器将确保任何给定类型的所有字段在实例中的起始偏移量与匹配该类型的边界对齐-假设没有使用显式布局。

用户定义类型本身具有对齐方式,该对齐方式被计算为其所有字段类型中的最高对齐方式。如果有必要,可以扩展类型的大小,以使类型的大小也对齐。

但当然,所有引用类型在大小和对齐方式上仍然只有IntPtr.Size,所以引用类型的大小不会影响该类型的数组。

注意,CLR可以根据其判断来选择与上述不同的布局类型,可能是为了增加高速缓存局部性或减少对齐所需的填充。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/324053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档