[Unity3D学习]Unity C# 的类型存储大小测试

最近在做内存优化,发现了一些问题,虽然知道了结果,但是并没有找到为什么,所以把问题给贴出来,或许哪天遇到大神能给我解惑!

发现的问题其实就是object[]  数据 比 float[] 要大,为什么要大呢?

因为是项目中遇到这个问题,一个字段存储了大量的object数据,其实这些object 都是int 或者是float.

然后我们做了一个测试,发现使用object字典存储的内存 要比使用list存储的内存大上15M,这让我们起了疑心,所以我写了一个小的实例来验证这个问题。

猜想是不是object[] 比 float[]大

20161221-194522

上面的图是我测试的结果,我先输入了1 内存增加了15.26M  然后我输入2 内存增加了7.63M

这个结果表示确实是object[]会比较大,而且通过上图的结果 还可以看出object[] 比long[]数据 刚好大一倍,我这里大胆的推测一下object占用了16个字节(因为long是8个字节)

然后我还发现一个比较有趣的事情

20161221-195124

我发两个if 里面的for循环给注释掉,只是给object[] 、long[] 数组初始化,内存尽然是这个样子的。我输入的顺序还是先1后2

结果却是object[]的内存增加变小了,也就是说object[]在new的时候,C#做了某种操作,让object[]真是赋值的时候再去做操作。

而确定好的数据类型数据在创建的时候就已经把内存空间给确定好了。

我突然比较好奇,如果object[]存的不是基元类型呢,存储的就是object对象内存情况会是什么样子的呢?

在我的认知中,object 对象应该存储的是指针,指针是int型的。然而得到的结果是

20161221-195938

既然和上面的结果是一样的。也就是说object[]数组的存储不论是存储存储基元类型还是存储引用对象,每一个数据都会占用16个字节

 

这次测试得到的结果就是,基元类型的存储就不要使用object[]来存储了,这样五星中内存就增加了。。。!

 

再附上一张存储了float[]的截图,这个数据数据是完全正常的float[] 数据大小比long[]大小刚好小了一半!

20161221-201409

1 Comment

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.