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
}

Swift查看变量内存地址的更多相关文章

  1. 07_Python变量内存地址、小数据池

    一.变量在内存中的地址 变量:用来标识(identify)一块内存区域.为了方便表示内存,我们操作变量实质上是在操作变量指向的那块内存单元.编译器负责分配.我们可以使用Python内建函数id()来获 ...

  2. python变量内存地址释放与加速并行计算多线程

    1.导入numba和gc包进行并行计算和内存释放 代码如下很容易的: #coding:utf-8 import time from numba import jit, prange, vectoriz ...

  3. Python中查看变量的类型,内存地址,所占字节的大小

    查看变量的类型 #利用内置type()函数 >>> nfc=["Packers","49"] >>> afc=[" ...

  4. Python如何查看变量在内存中的地址

    在python中可以用id()函数获取对象的内存地址. 用法: object = 1 + 2 object -- 对象

  5. 经典的GDB调试命令,包括查看变量,查看内存

    经典的GDB调试命令,包括查看变量,查看内存 在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: p ...

  6. Visual Studio 调试系列7 查看变量占用的内存(使用内存窗口)

    系列目录     [已更新最新开发文章,点击查看详细] 在调试期间,“内存”窗口显示应用程序正在使用的内存空间. 调试器窗口(如监视窗口.自动窗口.局部变量窗口和快速监视对话框)显示变量,这些变量存储 ...

  7. vs中调试程序查看变量在内存中的内容的方法

    vs中调试程序 查看变量在内存中的内容的方法 https://blog.csdn.net/guojg1988/article/details/42922149 原文链接:http://www.sows ...

  8. C# 查看变量的内存占用和分布

    在程序的调试过程中,有时候我们想知道变量在内存中的具体占用状况,这样方便我们调试程序,以便于追踪变量的变化过程 这就需要查看变量的内存占用. 1.如何进入内存查看? 2.如何查看变量? 查看变量,需要 ...

  9. golang for 循环变量取内存地址

    前几天提交的代码进行测试的时候发现变量无法赋值,原始代码如下: for _, asset := range dspInfo.native.Assets { var resAsset protocol. ...

  10. python的变量,对象的内存地址以及参数传递过程

    作为一个由c/c++转过来的菜鸟,刚接触Python的变量的时候很不适应,应为他的行为很像指针,void* ,不知道大家有没有这样的感觉.其实Python是以数据为本,变量可以理解为标签.作为c/c+ ...

随机推荐

  1. Less预处理器的使用

    练习页面: <body> <div class="div1"> <div class="div2"></div> ...

  2. Vue 中引用第三方js总结

    vue中引用第三方js总结 By:授客 QQ:1033553122 实践环境 win10 Vue 2.9.6 本文以引用jsmind为例,讲解怎么在vue中引用第三方js类库 基础示例 1.把下载好的 ...

  3. uniapp生成的app怎么上架到iphone的app store

    首先这里需要强调的是,上架app store,必须用自己公司的账号的证书打包,不能使用别的公司的证书打包,因为假如使用别人的证书打包,打包出来的app,只能上传到别人的app store账号,你开发的 ...

  4. 【Lodop】01 Lodop手册阅读上手

    官方网站: http://www.c-lodop.com/index.html 版本:6.2.2.6 一.概述 Lodop是一款用于WEB打印开发的专业WEB打印控件 控件发布包有3个系统文件组成,主 ...

  5. 强化学习:经典测试环境Cart-pole的原始文献

    参考文献格式: A. G. Barto, R. S. Sutton, and C. W. Anderson. Neuronlike adaptive elements that can solve d ...

  6. baselines算法库的安装——Ubuntu20.04系统使用anaconda环境配置

    baselines算法库不做过多介绍,个人认为这是公开是所有reinforcement learning算法库中最权威的,虽然没有后期更新,也就是没有了学术界的state of the art ,  ...

  7. AQS源码解读之ReentrantLock-图解

    1.背景 1.AQS简介AQS全称为AbstractQueuedSynchronizer(抽象队列同步器).AQS是一个用来构建锁和其他同步组件的基础框架,使用AQS可以简单且高效地构造出应用广泛的同 ...

  8. QT中TreeWidget树控件的使用

    关于Item Widgets中Tree Widget的使用方法! TreeWidget树控件的使用 创建列表头, 该控件有什么属性 QStringList header_list; header_li ...

  9. Deformable DETR:商汤提出可变型 DETR,提点又加速 | ICLR 2021 Oral

    DETR能够消除物体检测中许多手工设计组件的需求,同时展示良好的性能.但由于注意力模块在处理图像特征图方面的限制,DETR存在收敛速度慢和特征分辨率有限的问题.为了缓解这些问题,论文提出了Deform ...

  10. git push --recurse-submodules = on-demand 递归push

    I have the following project structure: root-project | |-- A | | | |-- C | |-- B A和B是根项目的子模块. C又是项目A ...