iOS底层系列06 -- OC对象的内存对齐与分配

2021-02-05  本文已影响0人  YanZi_33
#import <objc/runtime.h>
#import <malloc/malloc.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        NSObject *p1 = [[NSObject alloc]init];
    
        int size1 = sizeof(p1);
        size_t size2 = class_getInstanceSize([p1 class]);
        size_t  size3 = malloc_size((__bridge const void*)(p1));
        
        NSLog(@" size1 = %d",size1);
        NSLog(@" size2 = %lu",size2);
        NSLog(@" size3 = %lu",size3);
    }
    return 0;
}
Snip20210624_2.png
size_t class_getInstanceSize(Class cls){
    if (!cls) return 0;
    return cls->alignedInstanceSize();
}
uint32_t alignedInstanceSize() const {
        return word_align(unalignedInstanceSize());
}
static inline uint32_t word_align(uint32_t x) {
    return (x + WORD_MASK) & ~WORD_MASK;
}

结构体内存对齐

struct Student{
    int age;
    char name;
    float weight;
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        struct Student s1;
        NSLog(@" s1的内存大小 = %lu",sizeof(s1)); //s1的内存大小 = 12
    }
    return 0;
}
Snip20210205_61.png
struct Dog{
    char name;
    int age;
    double height;
    short color;
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        struct Dog d1;
        NSLog(@"d1的内存大小 = %lu",sizeof(d1));//d1的内存大小=24
    }
    return 0;
}
Snip20210205_62.png
struct Dog{
    double height;
    int age;
    short color;
    char name;
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        struct Dog d1;
        NSLog(@"d1的内存大小 = %lu",sizeof(d1));//d1的内存大小=16
    }
    return 0;
}
Snip20210205_63.png
struct Dog{
    double height;
    int age;
    short color;
    char name;
};

struct Student{
    char name;
    double height;
    int age;
    struct Dog dog;
    float weight;
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        struct Student s1;
        NSLog(@"s1的内存大小 = %lu",sizeof(s1));//d1的内存大小=48
    }
    return 0;
}

内存优化(属性重排)

@interface YYPerson : NSObject

@property(nonatomic,assign)int age;

@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        YYPerson *p1 = [[YYPerson alloc]init];
        p1.age = 10;
    }
    return 0;
}
Snip20210205_67.png
@interface YYPerson : NSObject

@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *name;

@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        YYPerson *p1 = [[YYPerson alloc]init];
        p1.age = 10;
        p1.name = @"liyanyan";
    }
    return 0;
}
Snip20210205_68.png
@interface YYPerson : NSObject

@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)char p_char;

@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        YYPerson *p1 = [[YYPerson alloc]init];
        p1.age = 10;
        p1.name = @"liyanyan";
        p1.p_char = 'A'; //65
    }
    return 0;
}
Snip20210205_72.png
@interface YYPerson : NSObject

@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *name1;
@property(nonatomic,assign)char p_char1;
@property(nonatomic,copy)NSString *name2;
@property(nonatomic,assign)char p_char2;
@property(nonatomic,assign)short s_age;
@property(nonatomic,assign)char p_char3;
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        YYPerson *p1 = [[YYPerson alloc]init];
        p1.age = 10;
        p1.name1 = @"liyanyan";
        p1.p_char1 = 'A'; //65
        p1.name2 = @"li";
        p1.p_char2 = 'B'; //66
        p1.s_age = 30;
        p1.p_char3 = 'C'; //67
        
        int size1 = sizeof(p1);
        size_t size2 = class_getInstanceSize([p1 class]);
        size_t  size3 = malloc_size((__bridge const void*)(p1));
        
        NSLog(@" size1 = %d",size1); //8
        NSLog(@" size2 = %zu",size2); //40
        NSLog(@" size3 = %zu",size3); //48
    }
    return 0;
}
Snip20210207_75.png Snip20210207_76.png
最终总结:
上一篇下一篇

猜你喜欢

热点阅读