内存模型(类与结构)

时间:2018-10-23 07:04:16

标签: .net memory core

最近阅读了几本有关.net核心内存模型的书,但仍然有一些未解决的问题,我希望有人已经知道答案并可以与其他人分享。

所以-简单测试: 1.用三个道具创建一个简单的类“ MyType”:

int a;
int b;
double c;

现在-我创建了一个列表,保留1000.000个元素并填充它:

        List<MyType> someList = new List<MyType>(1000000);

        for (int i = 0; i < 1000000; i++)
        {
            someList.Add(new MyType());
        }

所以-现在-如果我将类用于“ MyType”声明-该程序将占用42 MB的内存。使用struct时-占用25 MB。 知道该类位于堆上并且构建是x86发行版时,我存储在堆上的每个对象的地址存储开销应为4字节。因此,一百万个对象应创建4 MB的“开销”。因此,我希望这些类占用29 MB而不是42 MB。因此,这里必须还有其他内容。...这是我想问的确切问题。

谢谢!

1 个答案:

答案 0 :(得分:2)

您无需考虑对象标头的大小,在x86上每个对象8个字节;所以又是8MB; 29 + 8 = 37,更接近;然后在分配区域中添加一些填充。

对象标头是位于每个堆分配的object实例之前的元数据,以说明类型是什么,等等。

一个结构体(当未装箱时等)没有对象头。