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

内存大小,内存对齐

作者: 李易_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参数是对象

相关文章

  • 内存对齐

    知识点概要 OC对象内存对齐结构体内存对齐 OC对象内存对齐 计算内存大小的三种方式 1.sizeof:系统提供的...

  • 内存大小,内存对齐

    一、结构体 此时执行sizeof(struct Student1),结果是8交换成员变量的顺序 此时执行sizeo...

  • OC底层原理 04:内存对齐原理

    在探讨内存对齐原理之前,首先介绍下iOS中获取内存大小的三种方式 获取内存大小的三种方式 获取内存大小的三种方式分...

  • iOS底层原理04:内存对齐原理

    在探讨内存对齐原理之前,首先介绍下iOS中获取内存大小的三种方式 获取内存大小的三种方式 获取内存大小的三种方式分...

  • OC底层原理-内存对齐

    在探讨内存对齐原理之前,首先介绍下iOS中获取内存大小的三种方式 获取内存大小的三种方式 获取内存大小的三种方式分...

  • iOS-OC底层二 :修改系统内存对齐

    一、内存对齐 获取内存大小的三种方式分别是: sizeof:sizeof计算内存大小时,传入的主要对象是数据类型,...

  • iOS-底层原理 05:内存对齐原理

    iOS 底层原理 文章汇总 在探讨内存对齐原理之前,首先介绍下iOS中获取内存大小的三种方式 获取内存大小的三种方...

  • Golang内存对齐

    如何得到一个对象所占内存大小? 内存对齐: 为何会有内存对齐?1.并不是所有硬件平台都能访问任意地址上的任意数据。...

  • OC底层原理三:内存对齐分析

    获取内存大小 上一篇我们简单的提了下内存字节对齐以及为什么要内存字节对齐,那么我们首先看下有什么方式可以获取内存大...

  • 手撕 iOS 底层04 -- 内存对齐原理

    本章主要由结构体内存对齐到苹果的属性重排, 以及16字节对齐算法 0x00 -- 获取内存大小的三种方式 获取内存...

网友评论

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

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