從匯編角度揭秘C++構造函數(1)

C++的構造函數一直比較神秘,今天我們通過匯編的角度來揭秘一下,它的本質是什么。與常規函數有什么不同。從以下這段代碼說起:

class Person
{
public:Person(int age) { _age = age; }void printAge(){ printf("age = %d\r\n",_age); }
private:int _age;
};int main()
{Person tom(20);return 1;
}

如上所示,定義了一個Person類,以及聲明了一個構造函數(帶一個int型變量)。在main函數中聲明了一個tom的對象。我們查看上面代碼對應的匯編:

Person::Person(int) [base object constructor]:push    rbpmov     rbp, rspmov     QWORD PTR [rbp-8], rdimov     DWORD PTR [rbp-12], esimov     rax, QWORD PTR [rbp-8]mov     edx, DWORD PTR [rbp-12]mov     DWORD PTR [rax], edxnoppop     rbpret
main:push    rbpmov     rbp, rspsub     rsp, 16lea     rax, [rbp-4]mov     esi, 20mov     rdi, raxcall    Person::Person(int) [complete object constructor]mov     eax, 1leaveret

重點關注main函數的匯編,通過指令“call ? ?Person::Person(int) [complete object constructor]”,我們知道是在調用Person類的構造函數。我們再注意一下這條指令:“mov ? ? esi, 20”,即將20寫入esi這個寄存器中,根據之前的文章:從匯編的角度揭開C++ this指針的神秘面紗,我們知道這是在準備Person構造函數的形參,但是跟據函數傳參約定:

esi(即RSI的低32位),傳遞的是第二個參數,RDI傳遞的是第一個參數。上面匯編代碼中,Person類的構造函數明明只有一個形參,為什么需要傳遞兩個實參呢?答案是Person類的構造函數還有一個隱含的參數,根據之前文章從匯編的角度揭開C++ this指針的神秘面紗,這個參數就是this指針!從而我們可以得出一個結論:類的構造函數與普通函數并本質區別,只不過編譯器會'偷偷地'添加一個this指針作為第一個參數。

<構造函數揭秘繼續...>

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

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

相關文章

java10學習筆記

Java 10 于 2018 年 3 月發布&#xff0c;是 Java 平臺按照新的六個月發布周期發布的第一個版本。雖然相比 Java 8 和 Java 9 的大型更新&#xff0c;Java 10 的變化較小&#xff0c;但仍然引入了一些重要的特性&#xff0c;特別是本地變量類型推斷&#xff08;var&#xff09;…

Flutter Listview的基本使用

Listview() 前端頁面常見的一個以列表方式顯示內容的組件。可垂直或水平滾動的列表。屬性說明scrollDirection設置滾動的方向&#xff0c;取值包括horizontal、verticalreverse設置是否翻轉&#xff0c;默認值falseitemExtent設置滾動方向子元素的長度&#xff0c;垂直方向為高…

強化學習筆記:從Q學習到GRPO

推薦學習huggingface的強化學習課程&#xff0c;全面了解強化學習的發展史。 以下是個人筆記&#xff0c;內容不一定完整&#xff0c;有些是個人理解。 基于值函數(value function)的強化學習 基于值函數(value function)的強化學習&#xff1a;學習的是一個值函數&#xff0…

MySQL索引底層原理與性能優化實踐

#技術棧深潛計劃一、前言 在日常開發中&#xff0c;MySQL數據庫以其高效、易用、可擴展等特性成為最主流的關系型數據庫之一。而索引作為數據庫查詢優化的核心工具&#xff0c;被譽為“數據庫的加速器”。但你真的了解MySQL索引的底層原理嗎&#xff1f;為什么InnoDB默認采用B樹…

Ext系列文件系統

1.硬件常見的硬件有磁盤、服務器、機柜、機房機械磁盤但是計算機中唯一的一個機械設備磁盤外設的特點就是外設慢容量大&#xff0c;價格便宜1.1.磁盤的物理結構磁盤的物理圖&#xff1a;磁盤的存儲圖扇區:是磁盤存儲數據的基本單位&#xff0c;512字節&#xff0c;塊設備磁盤的…

前綴函數——KMP的本質

前綴函數我個人覺得 oiwiki 上的學習順序是很合理的&#xff0c;學 KMP 之前先了解前綴函數是非常便于理解的。前后綴定義 前綴 prefixprefixprefix 指的是從字符串 SSS 的首位到某個位置 iii 的一個子串&#xff0c;這樣的子串寫作 prefix(S,i)prefix(S,i)prefix(S,i)。 后綴 …

解決chrome下載crx文件被自動刪除,加載未打包的擴展程序時提示“無法安裝擴展程序,因為它使用了不受支持的清單版本解決方案”

解決chrome下載crx文件被自動刪除 【chrome設置-隱私與安全-安全瀏覽】&#xff0c;選擇 不保護 【chrome設置-下載內容】&#xff0c;勾選 下載前詢問每個文件的保存位置 下載crx文件時&#xff0c;選擇保存文件夾&#xff0c;將 .crx后綴 改為 .zip后綴&#xff0c;再確定。 …

嵌入式學習day23-shell命令

linux軟件編程學習大綱&#xff1a;1.IO操作文件2.多任務編程3.網絡編程4.數據庫編程5.硬件設備管理學習目標&#xff1a;1.學習接口調用&#xff08;第一層&#xff09;2.軟件操作流程和思想&#xff08;第二層&#xff09;3.軟件設計思想和流程架構&#xff08;第三層&#x…

GPT-5 系列深度詳解:第1章-引言(目錄)

1 引言2 模型數據與訓練3 觀察到的安全挑戰與評估 3.1 從強制拒絕到安全完成 3.2 禁?內容 3.3 拍?屁 3.4 越獄 3.5 指令層級 3.6 幻覺 3.7 欺騙 3.7.1 欺騙思維鏈監控 3.8 圖像輸入 3.9 健康 3.10 多語言性能 3.1.1公平性與偏見&#xff1a; BBQ評估4 紅隊測試與外部評估…

NineData 新增支持 AWS ElastiCache 復制鏈路

2025 年&#xff0c;絕大多數企業已完成業務上云&#xff0c;以獲取更高的彈性、可擴展性和成本效益。AWS ElastiCache 作為 AWS 提供的全托管式內存數據庫服務&#xff0c;已成為許多企業在云上構建高并發、低延遲應用的理想選擇。NineData 數據復制現已全面支持從自建 Redis …

人工智能-python-特征選擇-皮爾遜相關系數

以下是關于特征選擇中常用方法的表格總結&#xff0c;并且詳細闡述了皮爾遜相關系數的原理、計算方法、步驟以及示例。 常用特征選擇方法總結方法原理優點缺點使用場景過濾法&#xff08;Filter Method&#xff09;基于特征的統計信息&#xff08;如相關性、方差等&#xff09;…

LabVIEW多循環架構

?LabVIEW的多循環架構是一種常見的架構&#xff0c;本文Temperature Monitoring.vi 采用 LabVIEW 典型的多循環并行架構&#xff0c;通過功能模塊化設計實現溫度監測全流程&#xff0c;各循環獨立運行又協同工作&#xff0c;構成完整的監測系統。1. 事件處理循環&#xff08;E…

深入理解Maven BOM

一、什么是Maven BOM&#xff1f; 1.1 BOM的基本概念 Maven BOM&#xff08;Bill of Materials&#xff0c;材料清單&#xff09;是一種特殊的POM文件&#xff0c;它主要用于集中管理多個相關依賴的版本。BOM本身不包含任何實際代碼&#xff0c;而是作為一個 版本管理的"參…

Mysql分頁:高效處理海量數據的核心技術

Mysql分頁&#xff1a;高效處理海量數據的核心技術01 引言 在Web應用、移動應用或數據分析場景中&#xff0c;數據庫常常需要處理百萬甚至千萬級的數據記錄。一次性加載所有數據不僅效率低下&#xff0c;還會消耗大量網絡帶寬和內存資源。數據庫分頁技術正是解決這一挑戰的關鍵…

通過 Docker 運行 Prometheus 入門

Promethues 組件 prometheus serverexporteralertmanager 環境準備 Docker 拉取鏡像備用 # https://hub.docker.com/r/prom/prometheus docker pull m.daocloud.io/docker.io/prom/prometheus:main# https://hub.docker.com/r/prom/node-exporter docker pull m.daocloud.io/do…

Java 8特性(一)

目錄 一、Lambda表達式 1、語法格式&#xff1a; &#xff08;1&#xff09;接口名 對象名(參數類型1參數名1,....參數類型n 參數名n)->{方法體;} &#xff08;2&#xff09;參數類型h 參數名n:接口中抽象方法的參數項 &#xff08;3&#xff09;->:表示連接操作 &a…

【代碼隨想錄|232.用棧實現隊列、225.用隊列實現棧、20.有效的括號、1047.刪除字符串中的所有相鄰重復項】

232.用棧實現隊列 timutimtit232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; class MyQueue { public:stack<int> Sin;stack<int> Sout;MyQueue() {}void push(int x) {Sin.push(x);}int pop() {if (Sout.empty()) { // 出棧為空就把入棧的數導出來w…

碼上爬第三題【協程+瀏覽器調試檢測】

前言&#xff1a;圖靈第三題就是對用戶瀏覽器調試檢測&#xff0c;檢測鼠標右擊打開控制臺&#xff0c;檢測鍵盤按鍵ctrlshifti&#xff0c;從瀏覽器設置打開開發者工具也不行&#xff0c;應該是有瀏覽器寬高檢測的&#xff0c;所以我們保證瀏覽器頁面寬高不變即可。你如果想右…

windows、linux應急響應入侵排查

windows入侵排查 1.1檢查賬號 1.查看服務器是否有弱口令&#xff0c;遠程管理端口是否對公網開放 2.查看服務器是否存在可疑賬號、新增賬號 檢查方法&#xff1a;打開 cmd 窗口&#xff0c;輸入 lusrmgr.msc 命令&#xff0c;查看是否有新增/可疑的賬號&#xff0c;如有管…

11. 為什么要用static關鍵字

11. 為什么要用static關鍵字 static&#xff1a;通常來說&#xff1a;在new一個對象的時候&#xff0c;數據存儲空間才會被分配&#xff0c;方法才能被外界使用。但是有時只想單獨分配一個存儲空間&#xff0c;不考慮需要創建對象或不創建對象&#xff0c;在沒有對象的情況下也…