swift -(5) 匯編分析結構體、類的內存布局

一、結構體

在 Swift 標準庫中,絕大多數的公開類型都是結構體,而枚舉和類只占很小一部分

比如Bool?Int?Double?String?Array?Dictionary等常見類型都是結構體

①  struct Date {
②         var year: Int
③         var month: Int
④         var day: Int ⑤  }
⑥  var date = Date(year: 2019, month: 6, day: 23)

?所有的結構體都有一個編譯器自動生成的初始化器( initializer ,初始化方法、構造器、構造方法)

在第⑥行調用的,可以傳入所有成員值,用以初始化所有成員(存儲屬性,Stored?Property

二、結構體的初始化器

編譯器會根據情況,可能會為結構體生成多個初始化器,宗旨是:保證所有成員都有初始值

從這列子中可以看出,編譯器最終選擇什么初始化器和結構體原始定義有沒有賦默認值有關,編譯器選擇的初始化器會保證所有成員都有初始值;

三、這能編譯通過么

struct Point {  var x: Int? var y: Int?
}
var p1 = Point(x: 10, y: 10)
var p2 = Point(y: 10)
var p3 = Point(x: 10)
var p4 = Point()

根據編譯器初使化餓的本質保證所有成員都有初始值

可選項都有個默認值nil

因此可以編譯通過

四、自定義初始化器

注:?一旦在定義結構體時自定義了初始化器,編譯器就不會再幫它自動生成其他初始化器

因此下邊的代碼后邊三句會撥錯

五、窺探初始化器的本質分析自定義初始化器和編譯器會我們生成的初始化器是一樣的么

第一句 編譯器的初始化qi
struct Point {
var x: Int = 0 var
y: Int = 0
}
var p = Point()第二句  自己的初始化qi
struct Point { 
var x: Int 
var y: Int
init() {  
x = 0 
y = 0}
}
var p = Point()


通過上面的匯編指令可以看出 編譯器自己調用的初始化qi和我們自己寫的初始化qi其實是一樣的

六、結構體占用內存大小

七、

類的定義和結構體類似,但編譯器并沒有為類自動生成可以傳入成員值的初始化器

如何里面的x和y 沒有初使值,你調用無參會報錯,因為你的對象創建完成后,你里面的x和y成員沒有值是不安全的

如果類的所有成員都在定義的時候指定了初始值,編譯器會為類生成無參的初始化器;

成員的初始化是在這個初始化器中完成的

八、結構體與類的本質區別

結構體是值類型(枚舉也是值類型),類是引用類型(指針類型)

九、值類型 的深拷貝

值類型賦值給var?let或者給函數傳參,是直接將所有內容拷貝一份

類似于對文件進行copy?paste操作,產生了全新的文件副本。屬于深拷貝(deep?copy?

p2.x = 11 p2.y = 22
// 請問p1.x和p1.y是多少?依然是原來的10和20

十 、值類型的賦值操作

在Swift標準庫中,為了提升性能,String?Array?Dictionary?Set采取了Copy On Write的技術比如僅當有“寫”操作時,才會真正執行拷貝操作

對于標準庫值類型的賦值操作,?Swift 能確保最佳性能,所有沒必要為了保證最佳性能來避免賦值

?建議?:不需要修改的,盡量定義成let

為了提升性能,String?Array?Dictionary?Set采取了Copy On Write的

var?s1 =?"Jack"?var?s2?=?s1

如有了這句才會有深拷貝,在之前沒有發生寫操作,直接就是淺拷貝

s2.append("_Rose")

print(s1) //?Jack

print(s2) //?Jack_Rose

十一、引用類型的賦值

s2.width =?11??s2.height =?22

// 請問s1.widths1.height是多少 11 22?

十二、堆空間內存占用情況

class Point  {
var x = 11
var test = true 
var y = 22
}
var p = Point()
class_getInstanceSize(type(of: p)) // 40
class_getInstanceSize(Point.self) // 40內存地址的前16字節存的是p的地址,堆空間會檢查是不是16的倍數,對空間內存對其是48
根據內存對其 分配40哥字節,內存地址按8對其,實際用到的是16+8+8+3 =33

總結-匯編內存存值總結 5? 1.30

內存地址格式為:0x4bdc(%rip) ,一般是全局變量 ,全局區(數據段)

內存地址格式為:-0x78(%rbp) ,一般是局部變量 ,棧空間

內存地址格式為:0x10(%rax) ,一般是堆空間

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73080.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始學機器學習——初探分類器

首先給大家介紹一個很好用的學習地址:https://cloudstudio.net/columns 在上一節中,我們已經完成了對所有經過均衡和清洗的菜品數據的準備工作。接下來,我們將考慮使用多種算法,也就是不同的分類器,來構建模型。我們將利用這個數據集和各種分類器,基于一組特定的配料,預…

黑色RGB是什么

>好的,用戶現在問的是“黑色rgb是什么”。我需要先理解用戶的問題。之前用戶在使用MATLAB調整網格線顏色時,可能看到了默認顏色是黑色,或者之前我提到過默認顏色是[0.15 0.15 0.15],而用戶可能現在想知道黑色的RGB值具體是什么…

做到哪一步才算精通SQL

做到哪一步才算精通SQL-Structured Query Language 數據定義語言 DDL for StructCREATE:用來創建數據庫、表、索引等對象ALTER:用來修改已存在的數據庫對象DROP:用來刪除整個數據庫或者數據庫中的表TRUNCATE:用來刪除表中所有的行…

《深度解析DeepSeek-M8:量子經典融合,重塑計算能效格局》

在科技飛速發展的今天,量子計算與經典算法的融合成為了前沿領域的焦點。DeepSeek-M8的“量子神經網絡混合架構”,宛如一把鑰匙,開啟了經典算法與量子計算協同推理的全新大門,為諸多復雜問題的解決提供了前所未有的思路。 量子計算…

解決電腦問題(2)——主板問題

當電腦主板出現問題時,可以嘗試以下解決方法: 外觀檢查與清潔 檢查硬件連接:仔細查看主板上的各種硬件連接,包括 CPU、內存、顯卡、硬盤、電源等的連接線是否松動或損壞。確保所有插頭都牢固地插入相應的插槽中,如有松…

Java 大視界 -- Java 大數據在智能家居能源管理與節能優化中的應用(120)

💖親愛的朋友們,熱烈歡迎來到 青云交的博客!能與諸位在此相逢,我倍感榮幸。在這飛速更迭的時代,我們都渴望一方心靈凈土,而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識,也…

【網絡】TCP常考知識點詳解

TCP報文結構 TCP報文由**首部(Header)和數據(Data)**兩部分組成。首部包括固定部分(20字節)和可選選項(最多40字節),總長度最大為60字節。 1. 首部固定部分 源端口&…

算法1-6 一元三次方程求解

題目描述 有形如:ax3bx2cxd0 這樣的一個一元三次方程。給出該方程中各項的系數(a,b,c,d 均為實數),并約定該方程存在三個不同實根(根的范圍在 ?100 至 100 之間),且根與根之差的絕對值 ≥1。要…

05.基于 TCP 的遠程計算器:從協議設計到高并發實現

📖 目錄 📌 前言🔍 需求分析 🤔 我們需要解決哪些問題? 🎯 方案設計 💡 服務器架構 🚀 什么是協議?為什么要設計協議? 📌 結構化數據的傳輸問題 …

大數據面試之路 (一) 數據傾斜

記錄大數據面試歷程 數據傾斜 大數據崗位 ,數據傾斜面試必問的一個問題。 一、數據傾斜的表現與原因 表現 某個或某幾個Task執行時間過長,其他Task快速完成。 Spark/MapReduce作業卡在某個階段(如reduce階段),日志顯…

僅僅使用pytorch來手撕transformer架構(3):編碼器模塊和編碼器類的實現和向前傳播

僅僅使用pytorch來手撕transformer架構(2):編碼器模塊和編碼器類的實現和向前傳播 往期文章: 僅僅使用pytorch來手撕transformer架構(1):位置編碼的類的實現和向前傳播 最適合小白入門的Transformer介紹 僅僅使用pytorch來手撕transformer…

《OpenCV》—— dlib(換臉操作)

文章目錄 dlib換臉介紹仿射變換在 dlib 換臉中的應用 換臉操作 dlib換臉介紹 dlib 換臉是基于 dlib 庫實現的一種人臉替換技術,以下是關于它的詳細介紹: 原理 人臉檢測:dlib 庫中包含先進的人臉檢測器,如基于 HOG(方向…

機器學習中的梯度下降是什么意思?

梯度下降(Gradient Descent)是機器學習中一種常用的優化算法,用于最小化損失函數(Loss Function)。通過迭代調整模型參數,梯度下降幫助模型逐步逼近最優解,從而提升模型的性能。 1.核心思想 梯…

三、Docker 集群管理與應用

(一)項目案例 1、準備主機 (1)關閉防火墻,或者開放TCP端口2377(用于集群管理通信)、TCP/UPD端口7946(用于節點之間的通信)、UDP端口4789(用于overlay網絡流…

網絡DNS怎么更改?

訪問速度慢或某些網站無法打開?改變網絡DNS設置可能會幫助解決這些問題。本文將詳細介紹如何更改網絡DNS,包括更改的原因、具體步驟。 一、為什么要更改DNS? 更改DNS的原因有很多,以下是一些主要的考慮因素:某些公共DNS服務器的響應速度比…

江科大51單片機筆記【12】DS18B20溫度傳感器(上)

寫在前言 此為博主自學江科大51單片機(B站)的筆記,方便后續重溫知識 在后面的章節中,為了防止篇幅過長和易于查找,我把一個小節分成兩部分來發,上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論…

基于springboot+vue的佳途旅行分享預約平臺

一、系統架構 前端:vue2 | element-ui | html 后端:springboot | mybatis-plus 環境:jdk1.8 | mysql | maven | node 二、代碼及數據庫 三、功能介紹 01. web端-注冊 02. web端-登錄 03. web端-系統主頁1 04. web端-系統主頁2 05. we…

【數據結構】2算法及分析

0 章節 1.4到1.5小節。 掌握算法概念、特性、描述、算法性能時間復雜度和空間復雜度; 理解遞歸含義? 掌握實現遞歸的條件和時機; 應用簡單遞歸問題的算法設計; 重點 算法…

【一起學Rust | Tauri2.0框架】基于 Rust 與 Tauri 2.0 框架實現軟件開機自啟

文章目錄 前言 一、準備工作1.1 環境搭建1.2 創建 Tauri 項目1.3 添加依賴 二、實現開機自啟的基本原理2.1 開機自啟的基本概念2.2 Tauri 應用的生命周期 三、Windows 平臺實現3.1 Windows 注冊表機制3.2 實現步驟3.3 注意事項 四、Linux 平臺實現4.1 Linux systemd 服務4.2 實…

一周熱點-OpenAI 推出了 GPT-4.5,這可能是其最后一個非推理模型

在人工智能領域,大型語言模型一直是研究的熱點。OpenAI 的 GPT 系列模型在自然語言處理方面取得了顯著成就。GPT-4.5 是 OpenAI 在這一領域的又一力作,它在多個方面進行了升級和優化。 1 新模型的出現 GPT-4.5 目前作為研究預覽版發布。與 OpenAI 最近的 o1 和 o3 模型不同,…