先来看上一篇的问题
在64bit环境下,一个Person对象,一个Student对象占用多少内存呢?
@interface Person : NSObject
{
int _no;
}
@end
@implementation Person
@end
@interface Student : Person
{
int _age;
}
@end
@implementation Student
@end
这个问题里Person继承NSObject, Student继承Person
对象底层实现
通过转化看到底层实现每个对象的实现都包含的其父类的实现
struct NSObject_IMPL {
Class isa; //8个字节
};
struct Person_IMPL {
struct NSObject_IMPL NSObject_IVARS; //8个字节
int _no; //4个字节
}; //考虑到内存对齐:16个字节
struct Student_IMPL {
struct Person_IMPL Person_IVARS;//16个字节
int _age;//4个字节
}; //内存对齐:16个字节
- NSObject_IMPL占用8字节
- Person_IMPL中,NSObject_IMPL占用8字节, _no占用4字节,总共占用12字节,因为系统内存对齐原则,一个对象占用总字节应该是内存变量所占用最长字节数的整数倍,因此总共占用16字节
- Student_IMPL中,Person_IMPL占用16字节,_age占用4个字节,因为Person_IMPL中成员实际使用12字节,那么考虑到内存对齐,_age可以放到Person_IMPL未使用的4个字节中,因此总占用16字节。
那么是否真的是这样呢?我们通过代码验证一下
NSLog(@"%zd %zd",
class_getInstanceSize([Person class]),
class_getInstanceSize([Student class])
);
输出结果: 16 16
输出结果和分析一致。
网友评论