首页 > 系统相关 >Swift查看变量内存地址

Swift查看变量内存地址

时间:2024-09-25 21:38:14浏览次数:8  
标签:bitPattern 变量 point addressInt let address print 内存地址 Swift

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
        }

标签:bitPattern,变量,point,addressInt,let,address,print,内存地址,Swift
From: https://www.cnblogs.com/MrYU4/p/18432261/swift-cha-kan-de-zhi

相关文章

  • 01 内存地址 示例
    示例一:v1=[11,22,33]v2=[11,22,33]v1=666v2=666v1="asdf"v2="asdf"#以上数据都不是同一个内存地址#按理v1和v2应该是不同的内存地址。特殊:1.整型:-5~2562.字符串:"alex",'asfasdasdfasdfd_asdf'----"f_*"*......
  • C/C++语言基础--C++类数据、静态与非静态、常成员、友员、成员变量与函数指针等相关知
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言通过前面几节,我们介绍了C++的类与对象、构造与析构函数、拷贝等相关知识,这一篇将详细介绍了C++的成员变量相关的知识点与扩展C语言后面也会继续更新知识点,如内联汇编;本人现在正在写一个C语言的图书管理系统,1000多......
  • JDK的下载和环境变量的配置
    JDK(JavaDevelopmentKit)是Java开发工具包,是开发和编译Java应用程序所需的软件包。JDK由Java编译器、Java运行时环境(JRE)和Java开发工具组成。JDK提供了开发Java应用程序所需的工具和资源,包括Java编译器(javac)、Java虚拟机(JVM)、调试器(jdb)、应用程序打包工具(jar)等。它还包含了Jav......
  • Java基础部分-变量
    Java是一种强类型语言,每个变量都必须声明其类型Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。typevarName[=value][{,varName[=value]}];//数据类型变量名=值;可以使用逗号隔开来声明多个同类型变量。//类变量staticstaticdoublesal......
  • WINCCV7.5SP2使用VBA一次性添加多个IO域控件,并设置属性和其连接的变量
    这篇博客发表在某浪上,截至目前还没有通过审查,在这里也发一遍。前面的练习是先在页面手工放置IO域,然后使用VBA脚本批量设置连接的变量。这个练习进一步,使用VBA脚本创建IO域控件,并设置连接的变量。这个练习自动创建20个IO域,名字叫做IO1至IO20,并设置其连接的变量,为Real1至Real20;IO域......
  • WINCCV7.5SP2使用VBA一次性修改多个IO域连接的变量
    某浪博客那边效率低下,学习笔记类型的也要审核多日,还做了访问量清零的事情。我把今天的学习笔记在这里也记录一遍。前几天QQ群里面有哥们询问在WINCC中页面中一次性设定多个IO域连接变量,这些连接变量有规律。我以前没有用过VBA,尝试着弄了一下,现在把过程记录下来,当作学习笔记吧。......
  • 【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLo
    文章目录【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)1.基本API介绍2.简单用法3.应用场景4.Threadlocal与Synchronized区别5.内存溢出和内存泄漏5.2内存溢出(MemoryOverflow)5.2内存泄漏(Mem......
  • Swift解析json三种方式
    在Swift中解析本地JSON文件有多种形式,以下是其中几种常用的方式:使用Codable协议:使用Codable协议是Swift中解析JSON的推荐方式。首先,你需要定义一个对应的数据模型,该模型需要符合Codable协议。然后使用JSONDecoder对象将JSON数据解析为对应的数据模型对象。......
  • 变量的基本使用
    C语言里提供了一组工具,他们叫做标准函数;每个标准函数用来解决一个常见问题不同标准函数名字不同,可以在程序里编写函数调用语句使用标准函数printf标准函数可以用来把程序里的数字显示在终端窗口里为了使用这个标准函数需要包含stdio.h头文件可以在双引号里使用占位符(%+类型)把......
  • Chameleon 模板不替换 python 变量
    我是使用FastAPI和Python的Chameleon新用户。我在模板中有以下代码片段:${ag.name}在python代码中,我有一个类定义为:classAgeGroupInfo:definit(self,名称:str,检查:str):self.name=姓名self.checked=check视图字典包含AgeGroupInfo对象的列表......