iOS 底层 class_getInstanceSize、malloc_size - AlvinSunny/OC-TheUnderlying GitHub Wiki
首先看一段代码:
什么是size_t ?
size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。
它是一个与机器相关的unsigned(无符号)类型,其大小足以保证存储内存中对象的大小。
例如:我们常用的sizeof()操作的返回值就是 size_t类型的
例如:在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。
vector使用的下标实际也是size_t,源码是typedef size_t size_type。
因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。
为什么要有size_t类型?
在C++中,设计 size_t 就是为了适应多个平台的 。size_t的引入增强了程序在不同平台上的可移植性。size_t是针对系统定制的一种数据类型,一般是整型,因为C/C++标准只定义最低的位数,而不是必需的固定位数。而且在内存里,不论对数字的 高位对齐存储 或 低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。一般这种类型都会定义到它具体占几位内存等。
例如:在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。 分析可以得出一个结论:
系统分配了16个字节给NSObject对象(通过malloc_size()函数获得),但是NSObject内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize()函数获得;同时也可以通过 sizeof()运算符来获得)。
在内存中的表现是:
查看ios开源的底层源码,了解class_getInstanceSize()、malloc_size()的执行逻辑
class_getInstanceSize()执行流程图:
通过lldb命令来输出一个对象的内存表现情况:
从指令 memory read 0x10331a920 输出的结果可以看出(0x10331a920 :41 91 6c a9 ff ff 1d 00 00 00 00 00 00 00 00 )从41--00共16个字节其中[41 91 6c a9 ff ff 1d ]是有值得说明已经有数据存在。
列举常见的lldb指令 print 、p : 打印对象(以16进制8字节的方式输出)
po : 打印对象
memory read/数量格式字节数 内存地址 :输出内存16进制 16字节(读取内存)
x/数量格式字节数 内存地址:输出内存16进制 格式化排列(读取内存)
memory write 内存地址 数值,如memory write 0x0000010 10 : 修改内存中的值