首页 > 其他分享 >探索 Swift 中的 withUnsafeBufferPointer 与 Copy-On-Write 机制

探索 Swift 中的 withUnsafeBufferPointer 与 Copy-On-Write 机制

时间:2024-09-29 20:22:35浏览次数:8  
标签:point Swift array1 Write addressInt let address Copy withUnsafeBufferPointer

在 Swift 编程中,对内存管理和性能优化的理解是提高应用效率的关键。今天,我们将深入探讨两个重要主题:使用 withUnsafeBufferPointer 来访问数组的内存地址,以及 Swift 集合类型(如 Array、Dictionary 和 Set)所采用的 Copy-On-Write(COW)机制。

withUnsafeBufferPointer 简介

withUnsafeBufferPointer 是 Swift 标准库中的一个方法,允许我们直接访问数组或其他集合类型的底层内存。这对于需要高性能操作或与 C API 交互的场景尤为有用。不同于 withUnsafePointerwithUnsafeBufferPointer 提供对集合元素连续内存区域的访问,而不仅仅是指向集合本身的指针。

代码示例与分析

首先,让我们通过一个简单的代码示例来演示如何使用 withUnsafeBufferPointer

swift复制代码

var array1 = [1, 2, 3]
array1.withUnsafeBufferPointer { point in
let address = point.baseAddress!
let addressInt = Int(bitPattern: address)
print("\(addressInt)")
// 输出例如:105553141216992
}

在上述代码中,我们通过 withUnsafeBufferPointer 访问了 array1 的内存地址。point.baseAddress! 返回了指向数组第一个元素的指针,我们将其转换为整数以便打印。

接下来,我们比较使用 withUnsafePointer 和 withUnsafeBufferPointer 的不同:

swift复制代码

withUnsafePointer(to: array1) { point in
let address = UnsafeRawPointer(point)
let addressInt = Int(bitPattern: address)
print("\(addressInt)")
// 输出例如:6089438336
}

这里,withUnsafePointer 给出的是指向 array1 变量本身的指针地址,而不是其内容的地址。

验证 Copy-On-Write (COW)

Swift 的 Array、Dictionary 和 Set 等集合类型采用 COW 机制来优化性能。这意味着,当这些集合被赋值给另一个变量时,初始情况下并不会发生数据的实际复制;两个变量共享相同的内存。只有当其中一个变量被修改时,才会发生数据的复制,以确保数据的独立性。

让我们通过代码来验证这一点:

swift复制代码

var array1 = [1, 2, 3]
var array2 = array1 // 这里并没有真正复制数据,而是共享内存
array2.withUnsafeBufferPointer { point in
let address = point.baseAddress!
let addressInt = Int(bitPattern: address)
print("\(addressInt)")
// 输出与 array1 相同的地址,例如:105553141216992
}
// 修改 array2 后
array2[2] = 1
array2.withUnsafeBufferPointer { point in
let address = point.baseAddress!
let addressInt = Int(bitPattern: address)
print("\(addressInt)")
// 输出不同的地址,例如:105553141218080
}

在修改 array2 之前,array1 和 array2 的 withUnsafeBufferPointer 输出的地址是相同的,表明它们共享内存。修改 array2 后,地址发生变化,说明此时发生了数据复制。

结论

通过本文,我们了解了 withUnsafeBufferPointer 和 withUnsafePointer 的区别,以及如何利用它们来访问数组的内存地址。同时,我们也通过实例验证了 Swift 集合类型的 Copy-On-Write 机制,这一机制对于提高大规模数据处理时的性能和效率至关重要。在实际开发中,合理利用这些特性和工具,可以帮助我们编写更高效、更优化的代码。

标签:point,Swift,array1,Write,addressInt,let,address,Copy,withUnsafeBufferPointer
From: https://blog.csdn.net/mmoo_python/article/details/142534197

相关文章

  • Bad or missing usercopy whitelist? Kernel memory overwrite attempt detected to S
    Linux内核有一个usercopywhitelist机制,只允许这里面的region来做usercopy。如果是用kmem_cache_create申请的kmem_cache申请的内存空间来copytouser或者copyfromuser,那么就会报这个错。这时要用kmem_cache_create_usercopy,来将申请的区域加入到usercopywhitelist中。/***......
  • SwiftUI简明概念(2):renderingMode VS symbolRenderingMode
    一、什么是renderingModeImage的renderingMode可以设置两种值,.original表示渲染图片原来的像素,.template则表示用前景色去渲染图片像素非透明部分,图片只用作形状或者模版。二、什么是symbolRenderingModeImage的symbolRenderingMode可以设置四种值。我们知道SFsymbol可能是......
  • 极客大挑战2023-pwn-nc_pwntools WriteUp
    主要考查点Pwntools工具的基本使用方法解题思路1.nc连接题目,得到提示:根据题目,要求发送一个100长度的字符串,而且末尾需要为Sycloverb'A'*92+b'Syclover'2.发送第一个请求后进入第二步要求短时间内计算一个复杂算式,自己算是肯定不可能的,所以pwntools的recv来接收并完成......
  • 【CTF Web】Pikachu 反射型xss(get) Writeup(反射型XSS+GET请求)
    XSS(跨站脚本)概述Cross-SiteScripting简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:1.反射性XSS;2.存储型XSS;3.DOM型XSS;XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASPTOP10的排名中一直属于前三的江湖地位......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-12 Writeup(SQL注入+POST
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)解法随便提交一些数据。审查元素。<formaction=""name="form1"method="post"> <divstyle="margin-top:15px;height:30px;">Username:&nbsp;&nbsp;&......
  • BOOKS1 - Copying Books
    很显然看到要求最大值最小就可以想到二分答案,然后依次判断长度是否合法。这题的输出比较特殊越靠前的区间长度越小,所以我们要将最后得到的答案从后向前依次划分区间即可。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=510;intt;intn,......
  • SwiftUI简明概念(1):ForegroundColor VS ForegroundStyle
    一、何谓前景色在SwiftUI体系内,一个View可能包含一个或多个图层,那么最前面的一个图层就是ForegroundColor或ForegroundStyle作用的目标图层。当然这个图层可能不会响应前景色的要求:如上图所示,Rectangle作为shape图层,能响应前景色要求,导致图层变成前景色。Button的作用图层是......
  • READ_ONCE/WRITE_ONCE/ACCESS_ONCE和smp_store_release/smp_load_acquire作用
    READ_ONCE,WRITE_ONCE和ACCESS_ONCE宏在linux内核中出现的频率极高。那么这三个宏到底起了什么样的作用呢?smp_store_release/smp_load_acquire又如何呢?1、宏定义我们先看下READ_ONCE和WRITE_ONCE的宏定义:#defineREAD_ONCE(x)\ ({union{typeof(x)__val;char__......
  • Swift查看变量内存地址
    withUnsafePointer不说话,先放代码withUnsafeBufferPointer(to:a){pointinletaddress=UnsafeRawPointer(point)letaddressInt=Int(bitPattern:address)print("\(addressInt)")}验证copyonwrite值......
  • Swift解析json三种方式
    在Swift中解析本地JSON文件有多种形式,以下是其中几种常用的方式:使用Codable协议:使用Codable协议是Swift中解析JSON的推荐方式。首先,你需要定义一个对应的数据模型,该模型需要符合Codable协议。然后使用JSONDecoder对象将JSON数据解析为对应的数据模型对象。......