美文网首页
内存大小,内存对齐

内存大小,内存对齐

作者: 李易_64c1 | 来源:发表于2023-02-25 14:00 被阅读0次

    一、结构体

    struct Student1 {
        int age;    // 4
        bool a;     // 1
        bool b;     // 1
    };
    

    此时执行sizeof(struct Student1),结果是8
    交换成员变量的顺序

    struct Student2 {
      bool a;         // 1
      int age;        // 4
      bool b;         // 1
    };
    

    此时执行sizeof(struct Student2),结果是12

    解释:

    1、结构体的总大小(sizeof的结果),必须是其内部最大成员的整数倍,不足的需要补齐
    2、
    Student1:
    最大成员为4字节,不足4的部分补齐
    成员 age 占 4 个字节, 从 0 的位置开始
    成员 a 占 1 个字节, 从4开始
    成员 b 占 1 个字节, 从5开始,补齐2个字节
    一共是占 8 个字节。

    Student2:
    最大成员为4字节,不足4的部分补齐
    成员 a 占 1 个字节, 从0开始,补齐3个字节
    成员 age 占 4 个字节, 从 4 的位置开始
    成员 b 占 1 个字节, 从8开始,补齐3个字节
    一共是占 12 个字节。

    二、实例对象

    对象实例化之后,在内存中也是结构体,所以遵循结构体字节对齐的规则,在次基础上,系统还会进行内存对齐操作,所以内存分配大小是16的倍数

    @interface Object1 : NSObject
    
    @end
    
    int size1 = class_getInstanceSize(Object1.class);
    
    Object1 *obj = [[Object1 alloc] init];
    int size2 = malloc_size((__bridge void *)obj);
    

    此时size1的值是8,size2的值是16

    解释:

    Object1类型的实例对象没有任何属性,只有isa指针,占8个字节。objc_getInstanceSize求出结构体对齐之后的内存,为8;
    malloc_size求出实际分配的内存大小,内存对齐,变为16的倍数,为16。

    备注:

    sizeof计算类型占用的内存大小,其中可以放 基本数据类型、对象、指针
    class_getInstanceSize参数是类
    malloc_size参数是对象

    相关文章

      网友评论

          本文标题:内存大小,内存对齐

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