17- String 与 Array 分析

1.了解

汇编调试常用手段LLDB

  • 读取寄存器的值:

register read rax/格式(x/f/d )
register write rax 10
register read //所有寄存器

  • 读取内存地址:x/5xg

x 内存地址
x/3xw 3-显示3组数据
x-是16进制 /f是浮点/d是十进制
w(word)4个字节/ g(giant)-8个字节/b(byte)-1个字节/h(half)-两个字节

  • 打印函数调用栈

b t

  • 执行步骤

si
finish

从编码到启动APP

  • 小端:高地址存储高字节,低地址存储低字节
  • 大端:高地址存储低字节,低地址存储高字节

 

内存大概分布图

  • 全局变量,放在数据段
  • 全局变量的地址在编译的那一刻就确认了(偏移地址固定)

2.关于 String 的思考

  1. 1 个 String 变量占用多少内存?
一个 String 变量内存占用16个字节
  1. 下面 2 个 String 变量,底层存储有什么不同?
// 字符串长度 <= 0xF, 字符串内容直接存放在 str1 变量的内存中
var str1 = “0123456789”

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

3. 如果对 String 进行拼接操作,String 变量的存储会发生什么变化?

// 由于字符串长度 <= 0xF,所以字符串内容依然存放在str1变量的内存中
str1.append("ABCDE")
// 开辟堆空间
str1.append("F")

// 开辟堆空间
str2.append(“G")

3.关于Array的思考

public struct Array<Element>
var arr = [1, 2, 3, 4]
  • 一个Array变量占用多少内存?

        答:一个 Array 变量占用 8 个字节

  • 数组中的数据存放在哪里?

        答:Array 变量的 8 个字节存放的是这个堆空间的地址值,数组中的数据存放在堆空间,且堆空间前32个字节存放堆空间的一些信息,后面的才是字符串的真实内容。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值