看到了getSize这个方法之后,就想要进行一些测试了。这个方法返回的是对象占用内存的大小,如果getSize一个object,如果这个object中存在引用,那么这个引用的对象占用的内存不会被计算在内,而只是一个指针。

好了下面举一个例子。我有一个类像是这样。

1 package
2 {
3 public class NewClass
4 {
5 public function NewClass()
6 {
7 }
8 }
9 }

我们可以getSize试一下,显示的是8,这个8的意思是8个字节。也就是说一个类的基本结构将占用8个字节。
下面看这段代码。

01 package
02 {
03 public class NewClass
04 {
05 public var x:int = 0;
06
07 public function NewClass()
08 {
09 }
10 }
11 }

这样得到的将是12Bytes。这个结果是正确的因为int确实就占用4个字节。同理可以测试一下Number类型。
下面就是要看一下当有一个引用对象的时候的情况了。

01 package
02 {
03 import flash.display.Sprite;
04
05 public class NewClass
06 {
07 public var x:int = 0;
08
09 public var sp:Sprite = null;
10
11 public function NewClass()
12 {
13 }
14 }
15 }

这样会返回16Bytes,也就是说一个引用将会占用4个字节,那么就很容易想到了,其实引用就是一个指针,而一个指针占用的空间是和计算机硬件有关的,因为它需要描述一个地址。如果我们的是计算机是32位的那么,一个指针占用的空间将是32位也就是4Bytes,要是不足32位就无法描述出32位的地址空间了。那么如果是64位的计算机,这里应该返回20Bytes,一个指针将是8Bytes,64位。

那么如果再想这个类中添加一个方法呢,返回值会不会变大呢?答案是不会。因为虚拟机不会为了每一个对象的实例拷贝出一个方法,而是所有的同一对象的实例共用一个方法。

这就让我反思起了自己一个可笑的错误。我曾经总是以为Player内置的Rectangle太过庞大了,如果我只想记录x、y、width、height这四个分量,而不需要进行矩形的相关的计算的时候,使用内置的Rectangle是一种浪费,于是我就自己写了一个类,只用来记录这四个分量,心想这下轻巧了不少吧。可事实证明这样并没有任何的好处。首先占用的内存空间不会减少,其次,就算是内置的Rectangle类有很多方法,可是创建对象的速度并不会因此而慢多少,简直是微乎其微,再加上是内置的类,所以速度反而超出了许多。