美文网首页
内存对齐

内存对齐

作者: spades_K | 来源:发表于2020-10-14 19:08 被阅读0次

    原则

    • 1.数据成员对⻬规则: 结构(struct)或联合(union)的数据成员,第一个数据成员放在offset0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int4字节,则要从4的整数倍地址开始存储。

    • 2. 结构体作为成员: 如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储.)

    • 3. 收尾工作: 结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员整数倍,不足的要补齐

    示例

    内存占用大小

    1.结构体内存大小

    注:()内为实际占用的位置。

    
    struct Mystruct1 {
        int a;   // 4  (1 2 3 4)
        char b;  // 1  (5)
        float c; // 4  6 7 (8 9 10 11)
        double d;// 最大值 8  12 13 14 15 (16 17 18 19 20 21 22 23)  最大占用值的倍数补齐 所以是24
    }Mystruct1;
    
    struct Mystruct2 {
        char c;    // 1 (1)
        int a;     // 4 2 3 (4 5 6 7)
        double b;  //  最大值 8 (8 9 10 11 12 13 14 15) 补齐 16
    }Mystruct2;
    
    /// 结构体嵌套
    struct Mystruct3 {
        short a;            // 2  (1 2)
        bool b;             // 1   (3)
        struct Mystruct1 c; // 需要23 最大值为8,从8的整数倍开始。 4 5 6 7(8 9 10 ... 30)
        float d;            // 4   31 (32 33 34 35)  Mystruct1中最大值8的倍数补齐 所以是40.
    }Mystruct3;
    
    
    验证结构体占用内存大小

    2.OC对象内存大小

    @interface CKPerson : NSObject
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, copy) NSString *nickName;
    @property (nonatomic, assign) int age; // 4 字节
    @property (nonatomic, assign) long height; // 8字节
    @property (nonatomic) char c1; // 1字节
    @property (nonatomic) char c2; // 1 字节
    @end
    @implementation CKPerson
    
    @end
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            CKPerson *person = [CKPerson alloc];
            person.name      = @"CCCK";
            person.nickName  = @"KC";
            person.age       = 55;
            person.c1        = 'a';
            person.c2        = 'b';
            NSLog(@"%@",person);
        }
        return 0;
    }
    
    

    我们挨个打印下,查看内存地址打印结果。

    内存地址打印结果
    0x001d8001000033c5isa指针,那么问题来了,agec1c2的值储存在哪?
    答案是0x0000001600006463这里,但是打印出来书乱码,因为苹果对agec1c2属性进行了重排,通过4+1+1的方式进行8字节对齐,不足补齐的方式储存在同一内存块中,这样做的原因也是为了节省内存开销。 结果验证

    0x00000016 对应 age= 22 , 0x64对应ASCII码100也就是 b0x63对应ASCII码99也就是 a

    CKPerson内存分布情况

    相关文章

      网友评论

          本文标题:内存对齐

          本文链接:https://www.haomeiwen.com/subject/uztwpktx.html