docs: 汇编研究

This commit is contained in:
LiuBinPeng
2022-06-23 14:59:47 +08:00
parent 55d66cc4c5
commit f0e20eaf2e
30 changed files with 1042 additions and 347 deletions

View File

@@ -26,25 +26,37 @@ malloc_size((__bridge const void *)(p)) // 24 isa占8字节 + _name 指针占
class_getInstanceSize(p.class) // 32 ,系统内存对齐
```
为什么内存对齐?以空间换时间。系统以16字节对齐
为什么系统是由16字节对齐的?
x /6gx p.class
成员变量占用8字节对齐每个对象的第一个都是 isa 指针必须要占用8字节。举例一个极端 case假设 n 个对象,其中 m 个对象没有成员变量,只有 isa 指针占用8字节其中的 n-m个对象既有 isa 指针,又有成员变量。每个类交错排列,那么 CPU 在访问对象的时候会耗费大量时间去识别具体的对象。很多时候会取舍,这个 case 就是时间换空间。以16字节对齐会加快访问速度参考链表和数组的设计
类对象有且仅有1个。
p.class
class_getClass("Person")
[Person class]
p/x (class_data_bits_t *)地址
## class_rw_t、class_ro_t 区别?
## class_rw_t、class_ro_t、class_rw_ext_t 区别?
class_ro_t 在编译时期生成的class_rw_t 是在运行时期生成的。
拷贝带来的问题?当开发者通过 runtime第一次 动态修改类的信息的时候Apple 会生成 rwe。搜索 class_rw_ext_t
那么什么是 `class_rw_ext_t`?首先明确2个概念
- clean memory加载后不会被修改。当系统内存紧张时可以从内存中移除需要时可以再次加载
- dirty memory加载后会被修改一直处于内存中
Runtime 初始化的时候,遇到一个类,则会利用类的 `class_ro_t` 中的基础信息methods、properties、protocols来创建 `class_rw_t` 对象。`class_rw_t` 设计的目的就是为了 Runtime 所需Category 增加属性、协议、动态增加方法等),但是实际上那么多类大多数情况只有少部分类才需要 Runtime 能力。所以 Apple 为了内存优化,在 iOS 14 对 `class_rw_t` 拆分出 `class_rw_ext_t`,用来存储 Methods、Protocols、Properties 信息,会在使用的时候才创建,节省更多内存。
比如访问 method 的过程
```objectivec
// 新版
const method_array_t methods() const {
auto v = get_ro_or_rwe();
if (v.is<class_rw_ext_t *>()) {
return v.get<class_rw_ext_t *>(&ro_or_rw_ext)->methods;
} else {
return method_array_t{v.get<const class_ro_t *>(&ro_or_rw_ext)->baseMethods};
}
}
```
## 有类对象、为什么设计元类对象