一、结构体
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参数是对象
网友评论