類在記憶體中的分配

2022-08-29 20:30:30 字數 989 閱讀 8487

對於乙個宣告好的類,裡面可能有成員函式,靜態成員函式,成員變數,靜態成員變數,虛函式等,那麼這些資料都是怎麼分配到記憶體的呢?

class a{ //乙個簡單的類,方便下面描述資訊

public:

void show(){ cout<<」i am a」<

下面給出一些結論以及一些簡單的分析:

1.類的普通成員函式以及靜態成員函式不佔記憶體

類的成員函式實際上與普通的全域性函式類似,只不過在編譯的時候會在成員函式上加乙個指標(this)形參,(這非常重要)比如上面的方法可以理解為

show(&a

);這   樣呼叫show的時候就傳入了a的位址。成員函式的位址是全域性已知的,物件記憶體無需儲存,物件也並不知道它各個函式的位址(這裡理解是其他的途徑先呼叫該函式,再把物件傳入函式的形參中)

2.有虛函式的類中會有乙個維護虛函式表的指標,這樣會佔4個位元組,64位編譯器是可能是8個位元組。

3.類的屬性(成員變數),在例項化乙個物件時就為這些資料成員分配了記憶體,而且他們是相互獨立的。

4.靜態成員函式與一般成員函式的區別是沒有this指標,因此不能訪問非靜態的資料成員。

5.程式中的所有函式位於**區(c語言記憶體分配中有**區用於存放cpu執行的機器指令與**等,其中還有data資料區,bss區,堆疊)

6.靜態資料成員不屬於某個物件(未初始化的儲存在bss區,初始化的儲存在data區)

7.成員變數所佔大小存在記憶體對齊機制(在struct中也是一樣的)

比如上面的a,b,c分別是int,char,double型別,sizeof(int)+sizeof(char)8.空類佔乙個位元組

空類也需要例項化,例項化必須要在記憶體中分配一塊位址,編譯器一般會預設新增乙個位元組

類在記憶體中的分配問題

乙個類,有成員變數 靜態與非靜態之分 而成員函式有三種 靜態的 非靜態的 虛的。那麼這些個東西在記憶體中到底是如何分配的呢?以乙個例子來說明 include iostream.h class cobject void cobject fun cobject cobject cobject cobje...

C 類在記憶體中的分配

在網上看到這樣一道題 答案是24位元組。做這道題要理解三個知識點 一 32位和64位作業系統的區別 32位和64位指的是cpu一次處理資料的能力是32位還是64位,這裡涉及到的是處理器運算位數。簡單的說32位系統的位址匯流排是32位的,而64位系統的位址匯流排是64位的,這意味著乙個指標所占用的空間...

c 類例項在記憶體中的分配

c 是一種物件導向的程式語言,它向下保持了對c的相容,同時也允許程式設計師能夠自由的操控記憶體,雖然會帶來一些問題,但這不是我們要 的問題,略過不表。類是對某種物件的定義,包含變數和方法,也可以理解為現實生活中一類具有共同特徵的事務的抽象,他是物件導向語言的基礎。所以類是不占有記憶體的,可是如果類生...