日期:2014-05-17  浏览次数:20735 次

获取 Ilist集合 的内存大小
请看代码:

        public class student
        {
            private string _name;
            public string Name
            {
                set { _name = value; }
                get { return _name; }
            }

            private int _age;
            public int Age
            {
                set { _age = value; }
                get { return _age; }
            }
        }
        public void test()
        {
            IList<student> ils = new List<student>();
            for (int x = 0; x < 100000; x++)
            {
                student _s = new student();
                _s.Name = x.ToString();
                _s.Age = x;
            }
        }


问题:
1.IList<student> ils 在该实例的每一行中,是否都隐藏着 name 和 age,就像字典IList<IDictionary<string,object>> 一样。
2.能否取出该集合占用内存的大小,像 Ils.GetSize()。
------最佳解决方案--------------------
引用:
谢谢大家的指点!
第二个问题大家比较关注,其实我更关注的是第一个问题。
1.IList<student> ils 在该实例的每一行中,是否都隐藏着 name 和 age,就像字典IList<IDictionary<string,object>> 一样。

如果真的是那样,Ilist<student> 是否比 Ilist<object[]> 更加占用空间?毕竟后者只……


如果你的对象就是studuet,那么不必问,即使你用object[]他也是一样的大小,why?

我举个简单例子如果存在 Ilist<object[]> 对象source,那么 (student)source[100] 后得到一个student对象,如果按你的想法,变成object了就木有啥name,age属性了,那么红字所写的地方他又凭啥能凭空变出一个student对象呢
------其他解决方案--------------------
理论上是不可行的,因为每个类的内存大小都是不可计算了,你用类的大小*对象个数就是总大小了。
对于类,其内存占了2个部分——堆和栈,如果内部属性还有嵌套,要计算堆中的大小就更为复杂,引用地址永远是4字节(32位程序中),实际大小=引用地址+所指数据大小。最后还要考虑List中的保留空间,所以你粗略估算下可以,算不准确的。
------其他解决方案--------------------
"在C#里,是不能直接获取object占用内存大小的,因为它根本不是一个标准的布局。"  
".net的对象占用的空间,跟其它非托管程序是一样的,只是大部分的对象,由于是托管的,而且没有规定内存布局,所以我们无法获得其真正占用内存的大小."