C 類例項化時的記憶體分配

2021-08-01 14:01:01 字數 1167 閱讀 7062

初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的**與最終生編譯成的**卻大相徑庭,我們並不知道編譯器在後台做了什麼工作.這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗,是編譯器這方面的乙個具體功能.

首先:我們要知道什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址.

那我們先看看乙個例子:

#includeusing namespace std;

class a {};

class b{};

class c:public a;

class d:public b,public c{};

int main()

;class b;

int b::data1=0;

void main()

void f(int x){

cout<

程式執行輸出結果為:

10 ,

sizeof(a) 8

sizeof(b) 8

它們的結果均相同,可以看出類的大小與它當中的建構函式,析構函式,以及其他的成員函式無關,只與它當中的成員資料有關.呼叫建構函式和析構函式只需要知道函式的位址即可,而這些函式的位址只與型別有關,而與型別的例項無關,編譯器也不會因為這兩個例項而在例項內新增任何額外的資訊。

從以上的幾個例子不難發現類的大小:

1.為類的非靜態成員資料的型別大小之和.

2.有編譯器額外加入的成員變數的大小,用來支援語言的某些特性(如:指向虛函式的指標).

3.為了優化訪問效率,進行的邊緣調整.

4 與類中的建構函式,析構函式以及其他的成員函式無關.

總結:  

空的類是會占用記憶體空間的,而且大小是1,原因是c++要求每個例項在記憶體中都有獨一無二的位址。  

(一)類內部的成員變數: 

普通的變數:是要占用記憶體的,但是要注意對齊原則(這點和struct型別很相似)。  

static修飾的靜態變數:不占用記憶體,原因是編譯器將其放在全域性變數區。  

(二)類內部的成員函式:  

普通函式:不占用記憶體。  

虛函式:要占用4個位元組,用來指定虛函式的虛函式表的入口位址。所以乙個類的虛函式所占用的位址是不變的,和虛函式的個數是沒有關係的。 

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

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

C 類的例項中 記憶體分配詳解

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

C 類在記憶體中的分配

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