objective - c中关于实例所占内存的大小详解

  

  

续上一篇文章的介绍,这篇文章就诞生可。建议先看objective - c中类的数据结构,因这两部分的内容是不能断的,建议先去看看。

  

接下来的主题是objective - c中实例所占内存的大小。

  

以下都是以64位上分析的。

  

  

先定义这样的一个类:

     //类的申明   @ interface SizeObject: NSObject   {   @private   int _no;//int _age;   }   @end//类的实现   @ implementation SizeObject   @end      

主要是给SizeObject添加一个成员变量int _no;

  

运行如下代码:

        - (void) objSize {//class_getInstanceSize方法需要导入头文件# import & lt; objc/runtime.h>   NSLog (@ % zd, % zd, class_getInstanceSize ([NSObject类]),class_getInstanceSize ((SizeObject类)));//打印结果:8、16   }      

结论:NSObject的实例对象占用的内存大小是8个字节,然后添加一个int类型的之后的SizeObject的实例独享所占用的内存大小是16个字节。这是什么原因呢?
  

  

通过objective - c中类的数据结构知道对于NSOject中有一个成员变量类isa,其实类是一个指针类型,除此之外没有其它的成员变量,故NSObject的实例的内存大小为8个字节是必然。然而,为什么SizeObject的为什么是16个字节呢?仅仅是多了一个int类型的成员变量而已,int仅仅是4个字节而已。接下来将以上的代码int _age;也打开,运行代码SizeObject的大小还是16个字节,是否多一个int成员变量没有什么变化。主要原因是地址对齐原则决定的。

  

  

以上给出的的类中成员变量中的占用空间来决定的,确切的说是是通过类的内存布局决定的,也就是成员变量。但是在实际的+ alloc之后的一个实例对象中会占用多少内存地址呢?还有一个函数能malloc_size能计算出系统实际分配的内存空间,代码如下:

        - (void) objectSize {//一个alloc之后的对象   NSObject * obj=[NSObject alloc];//malloc_size需导入# import & lt; malloc/malloc.h>   NSLog (@ % zd, % zd, class_getInstanceSize ([NSObject类]),malloc_size ((__bridge void *) obj));//打印结果:8、16   }      

打印结果尽然是:8 6。说明在实际被+ alloc出来的对象并非是8,而是16。但是如果把-objectSize方法中的NSObject换成SizeObject的话,打印是:16日16。貌似两个函数的结果是一样的。对的,就NSObject是一个特例,现在是不是很想试一试NSProxy的了,结论是与NSObject是一样的。

  

那么问题来:为什么会这样呢?

  

 objective - c中关于实例所占内存的大小详解“> <br/>
  </p>
  <p>如果查看开源的代码,从这个allocWithZone开始查找calloc的过程,最终会查到上面图片中返回内存地址大小的函数。由此可知,在objective - c中的对象在真正分配内存空间的时候至少是16个字节。像NSObject或者继承于NSObject的子类而没有添加任何成员属性的类对象都是这样的,有多余在8个字节的空间没有被用于成员变量,可能用于其他地方。</p>
  <p>本系列的文章,有:</p>
  <p> 1, objective - c中类的数据结构<br/>
  </p>
  <p> 2, objective - c中实例所占内存的大小</p>
  <p> </p>
  <p>以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。<br/>
  </p><h2 class=objective - c中关于实例所占内存的大小详解