alloc的size分析

定义如下一个类:

@interface Person : NSObject
@property (nonatomic,assign) int height;
@property (nonatomic,assign) int age;
@property (nonatomic,assign) int no;
@end

@implementation Person
@end

将其转换为C++代码:

struct NSObject_IMPL {
	Class isa;
};

struct Person_IMPL {
	struct NSObject_IMPL NSObject_IVARS;  //8个字节
	int _height;	//4个字节
	int _age;	//4个字节
	int _no;	//4个字节
};

根据分析可知,Person_IMPL结构体内所有成员的总大小为20个字节,但由于内存对齐的原因,Person_IMPL结构体占用的内存大小应为24个字节。

实际上,使用 class_getInstanceSize 打印的结果为24,但是使用 malloc_size 打印的结果为32. 可见,Person实例对象实际占用的内存大小为32字节,尽管其只使用了24个字节。

alloc方法底层调用的方法为allocWithZone, 而allocWithZone方法则会调用calloc函数分配内存. 相关的源码可以在 https://opensource.apple.com/tarballs/libmalloc/ 进行下载。

根据源码可以发现,系统为了优化内存的使用效率,规定iOS中分配的内存大小都必须为16的倍数.

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章