15-String与Array

2021-08-09  本文已影响0人  SwordDevil

关于String的思考

// 字符串长度 <= 0xF,字符串内容直接存放在str1变量的内容中
var str1 = "0123456789"

// 字符串长度 > 0xF,字符串内容存放在__TEXT.cstring中(常量区)
// 字符串的地址值信息存放在str2变量的后8个字节中
var str2 = "0123456789ABCDEF"

/*
 占用16个字节,0的ASCII对应30 1的ASCII对应31 所以是直接将数值存储进去
 0x3736353433323130 0xea00000000003938
 0xe 用来做标识的
 a是用来存储长度的
 类似于OC的tagger pointer
 */
var str1 = "0123456789"
//var str1 = "0123456789ABCDE" // 0x3736353433323130 0xef45444342413938

/*
 如果超过16个字节
 0xd000000000000010 0x8000000100007ad0
 0xd00000000000001a 0x8000000100007ad0
 但是还是占用16个字节
 但是这2个地址变化不大 所以字符不是存储在这里
 
 汇编代码
 movabsq $0x7fffffffffffffe0, %rdx
 addq %rdx, %rdi
 
 字符串的真实地址 + 0x7fffffffffffffe0 = 0x8000000100007ad0
 字符串的真实地址 = 0x8000000100007ad0 - 0x7fffffffffffffe0 = 0x100007AF0
 
 0x100007AF0是"0123456789ABCDEF"的真实地址
 %rdi存放着字符串的真实地址
 %rsi存放的是字符串的长度0x10
 callq String.init
 %rdx存放的是 字符串的真实地址 + 0x7fffffffffffffe0
 */
var str2 = "0123456789ABCDEF" // 0xd000000000000010 0x8000000100007ad0
//var str2 = "0123456789ABCDEFFDSFSDFDSF" // 0xd00000000000001a 0x8000000100007ad0

// 如果字符串长度没超出0xF, 还是会保存str1变量的内存里面的
str1.append("ABCDE")
// 开辟堆空间
str1.append("F")

// 超出16个字节以后, 开辟堆空间
str2.append("G")

从编码到启动App

dyld_stud_binder

关于Array的思考

上一篇下一篇

猜你喜欢

热点阅读