内存大小,内存对齐

2023-02-25  本文已影响0人  李易_64c1

一、结构体

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参数是对象

上一篇 下一篇

猜你喜欢

热点阅读