首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Swift查看变量内存地址

编程知识
2024年09月25日 20:35

withUnsafePointer

不说话,先放代码

        withUnsafeBufferPointer(to: a) { point in
            let address = UnsafeRawPointer(point)
            let addressInt = Int(bitPattern: address)
            print("\(addressInt)")
        }

验证copy on write

值类型的赋值会对对象进行拷贝,对于一些容器,阿果做了为了避免Array、Set复制导致的性能损失, 会copy on write的机制进行优化。

对于 Array、Dictionary、Set 类型,当它们赋值的时候不会发生拷贝,只有在修改的之后才会发生拷贝。

当我们用代码验证的时候,在尝试使用withUnsafePointer的时候,会发现数组赋值之后,两个变量的地址会不一样,当然这也是合理,毕竟值类型赋值之后两个变量在内存上应该互为独立个体才对。
如果要验证COW,Array给我们提供了另一个方法,那就是withUnsafeBufferPointer,用此方法查看赋值后的数组,会看到输出的地址不变。
实际上withUnsafeBufferPointer指向的地址是数组存储数据的内存地址,withUnsafePointer指向的。

代码举例

        var array1 = [1, 2, 3]
        array1.withUnsafeBufferPointer { point in
            let address = point.baseAddress!
            let addressInt = Int(bitPattern: address)
            print("\(addressInt)")
            // 105553141216992
        }
        withUnsafePointer(to: array1) { point in
            let address = UnsafeRawPointer(point)
            let addressInt = Int(bitPattern: address)
            print("\(addressInt)")
            // 6089438336
        }
        var array2 = array1  // 这里并没有真正复制数据,而是共享内存
        array2.withUnsafeBufferPointer { point in
            let address = point.baseAddress!
            let addressInt = Int(bitPattern: address)
            print("\(addressInt)")
            // 105553141216992
        }
        withUnsafePointer(to: array2) { point in
            let address = UnsafeRawPointer(point)
            let addressInt = Int(bitPattern: address)
            print("\(addressInt)")
            // 6089438320
        }
        array2[2] = 1
        array2.withUnsafeBufferPointer { point in
            let address = point.baseAddress!
            let addressInt = Int(bitPattern: address)
            print("\(addressInt)")
            // 105553141218080
        }
        withUnsafePointer(to: array2) { point in
            let address = UnsafeRawPointer(point)
            let addressInt = Int(bitPattern: address)
            print("\(addressInt)")
            // 6089438280
        }
From:https://www.cnblogs.com/MrYU4/p/18432261/swift-cha-kan-de-zhi
本文地址: http://www.shuzixingkong.net/article/2305
0评论
提交 加载更多评论
其他文章 ZooKeeper 学习笔记
概述 ZooKeeper 是一个分布式协调服务,其设计初衷是为分布式软件提供一致性服务。ZooKeeper 提供了一个类似 Linux 文件系统的树形结构,ZooKeeper 的每个节点既可以是目录,也可以是数据,同时 ZooKeeper 提供了对每个节点的监控与通知机制。基于 ZooKeeper
JavaScript中if嵌套assert的方法
本文展示了如何在JavaScript中模拟`assert`函数,并在包含嵌套`if`语句的复杂逻辑中使用它来进行条件检查。通过使用`assert`,我们可以更清晰地表达代码的期望,并在不满足这些期望时立即获得反馈(通过抛出错误)。这种方法在开发过程中非常有用,特别是在编写单元测试或进行错误检查时。
技术博文的净土,博客园
最近一年里,园子发布了多篇“求救信”,无论园子的置顶文章,还是公众号平台,都在进行着发文。 在7年之前,那时候我在读大学一年级,因为对于计算机的兴趣,后来从学长那里了解到技术博客这个东西,最初接触的是某DN,后来发现博客园干净整洁无广告,页面清爽,后来又发现博客园竟然可以自定义,于是又不断的折腾自己
面试官:谈谈你对 IoC 和 AOP 的理解!
本文摘录自笔者开源的 Java 学习&面试指南(Github 收获146k star):JavaGuide 。 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 IoC? IoC 解决了什么问题? IoC 和 DI 的区别? 什么是 AOP? AOP 解决了什
面试官:谈谈你对 IoC 和 AOP 的理解! 面试官:谈谈你对 IoC 和 AOP 的理解! 面试官:谈谈你对 IoC 和 AOP 的理解!
bfs 与优先队列————洛谷p1126(历经两个小时总算AC了,哭晕)
机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 \(1.6\) 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 \(N\times M\) 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时
bfs 与优先队列————洛谷p1126(历经两个小时总算AC了,哭晕) bfs 与优先队列————洛谷p1126(历经两个小时总算AC了,哭晕)
IDEA如何查看每一行代码的提交记录(人员,时间)
前言 我们在使用IDEA开发时,一般需要使用git来管理我们的代码,而且大家协同开发。 有时候,我们在开发的时候,经常需要看一下当前的代码时谁开发的,除了看类上面的作者外,更精细的方式是看每一行代码的提交记录。 那么,我们该怎么查看呢? 如何查看 首先,我们需要保证我们的代码是有git来管理的。 然
IDEA如何查看每一行代码的提交记录(人员,时间) IDEA如何查看每一行代码的提交记录(人员,时间) IDEA如何查看每一行代码的提交记录(人员,时间)
logisim学习感想(持续更新)
状态机类型 存在两种类型的状态机,分别为mealy型状态机和moore型状态机,在实验中,二者的大体实现如下: 其中从输入到输出的连线只有mealy状态机才有,而moore型则无此线。 区分两种类型的状态机的方法 mealy的输出由输入和当前状态决定;moore的输出只由当前状态决定 具体体现在时序
logisim学习感想(持续更新) logisim学习感想(持续更新) logisim学习感想(持续更新)
数据结构 - 数组
学习数组,需掌握其ADT定义。数组为同类型元素序列,具固定长度、连续内存、类型相同、索引从0起等特性。通过ADT定义数组,实现类包含内存管理和长度字段,支持初始化、获取/设置元素、插入/删除及释放内存等操作。掌握数据结构需理解其定义并实现。
数据结构 - 数组 数据结构 - 数组