C 學習 物件模型之類及物件記憶體模型

2021-10-05 00:10:44 字數 1110 閱讀 7892

使用c++開發一年多,從今天開始系統性的總結下c++一些知識點,畢竟c++語言特性複雜而龐大,很難短時間全部掌握。

首先類可以模擬c語言的struct結構體,單純的宣告乙個類a,如果a沒有被例項化,那麼a是不會占用記憶體空間。這裡的類可以理解為一種特殊資料結構型別。再來談談物件,乙個類例項化後就變成乙個物件,且物件活躍在記憶體中。在這裡的物件可以理解為c語言的變數。c語言中定義乙個結構體變數,就是在記憶體中開闢一段空間來儲存結構體,那麼這段記憶體就是變數。類被例項化,本質也是在記憶體開闢一段空間來儲存類,這段記憶體空間就叫物件。

c++物件模型已經經過多年的發展,在這裡只介紹當前的c++物件記憶體模型。

class a;

virtual void fun2(){};

virtual void fun3(){};

在這裡定義了乙個類a,那麼如果 a a;例項化a生成物件a,那麼sizeof(a)是多大呢?

在物件的記憶體結構中,只有非靜態資料成員和指向虛函式表的指標占用物件記憶體。其中虛函式會被記錄在乙個虛函式表裡面。

由此推斷sizeof(a)是8位元組,其中只有a和虛函式指標存在於物件記憶體。

其中靜態資料成員是所有物件共享

疑惑:例項化類a產生物件a,這個步驟開闢了多少記憶體,如果只分配了8位元組,那麼當物件a呼叫非靜態成員函式時,這些東西記憶體裡面都沒有,因此類成員函式一定會被放入記憶體,那麼這個步驟又是什麼時候發生的呢?

猜測:每個物件都有自己唯一的非靜態成員函式,但這些非靜態成員函式不會被放到物件記憶體布局中,而是被放到了另外一段記憶體裡面,因此例項化類a這個步驟其實並不僅僅開闢了8位元組記憶體,這裡只是猜測,後續學習遇到再驗證。

最終結論:類的所有含有成員函式包括靜態成員函式,在程式載入時都放到了記憶體**區,所以以上例項化a記憶體就分配了8位元組。

每個類的成員函式在記憶體只會存在乙份,成員函式都是類似這樣a::fun1,下面給出實際除錯例子:

反彙編後如下

可以看到不同物件呼叫相同成員函式,成員函式的位址都是乙個。實際上物件再呼叫成員函式的時候會把this指標傳到成員函式中。經過編譯器處理後,成員函式可能會被定義成  void a::fun1(a *p) ,這裡的p就是this指標,根據這個this指標就可以訪問物件其他資料成員。換句話說,我們定義的成員函式,編譯器會給我們轉換成另一種形式。

Snail OC學習之類及物件

物件是對客觀事物的抽象,類是對物件的抽象。類是一種抽象的資料型別 物件導向的程式語言都是有類及物件的 類是由屬性及方法組成。oc中的所有官方類及自定義的類都是nsobject的直接或者間接子類 下面看看類的編寫規範 首先,command n 新建乙個類 dog類 看到會生成兩個檔案.h和.m h是對...

C 學習筆記之 類 物件

類是描述具有相同特徵和行為的抽象。物件是類的例項。類的作用就是分類!class關鍵字 class 類名 1 字段 類的共有屬性class car比如以上的brand,price,displacement 簡單的應用 using system namespace lesson12 class main...

C 物件模型探索 系列之類與物件概述

類與物件簡介 我們知道c語言中,資料與處理資料的操作 函式 是分開進行宣告。c 中通過抽象資料型別 abstact data type,adt 來將資料與函式繫結在一起。這種封裝方式並不會給c 的布局帶來成本,與c語言的一致。c 在記憶體布局以及訪問時間上主要受virtual帶來的影響 在c 封裝的...