最近阅读了几本有关.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。因此,这里必须还有其他内容。...这是我想问的确切问题。
谢谢!
答案 0 :(得分:2)
您无需考虑对象标头的大小,在x86上每个对象8个字节;所以又是8MB; 29 + 8 = 37,更接近;然后在分配区域中添加一些填充。
对象标头是位于每个堆分配的object
实例之前的元数据,以说明类型是什么,等等。
一个结构体(当未装箱时等)没有对象头。