C 類生成物件時記憶體的結構

2021-10-04 18:38:10 字數 1755 閱讀 7482

乙個類中都有什麼元素呢?

成員變數、成員函式。

成員變數又分普通的成員變數、static靜態成員變數、const常量

成員函式分為普通成員函式、靜態成員函式、虛函式、純虛函式等

那麼他們分別又是如何在類的記憶體中分配的呢?

1.記憶體對齊原則

不論是在類中還是在結構體中,都需要記憶體對齊,具體對齊方式(有乙個對齊係數——可以自己定義,同常是2、4或4的倍數,不是對齊係數倍數的元素會擴充套件到對齊係數的倍數上,整體的記憶體大小也是對齊係數的整數倍)。

2.空類

作為空類在記憶體中編譯器會自動為該類申請一位元組的記憶體空間,方便在**區儲存這個類。

3.成員變數在記憶體中的儲存方式

順序存貯!在記憶體中,不論類中的普通變數(即存在棧中的變數)是私有型別還是共有型別、保護型別,在記憶體中的存貯方式都是順序儲存結構,const(常量)型別在記憶體中依舊是順序結構。但是靜態變數由於要在主函式外部、類外部進行變數的再次空間賦值宣告,導致並沒有存在類裡的同一塊棧空間裡,而是另一塊的棧空間,所以他們之間的記憶體空間是不連續的。

4.成員函式在記憶體中的儲存方式

作為乙個類的成員函式,這些成員函式在編譯的時候就已經放到了**區,在執行時再分配記憶體。同乙個類的所有物件共享同一段**區記憶體的成員函式,相當於物件只例項化其中變數的位址,並沒有例項化函式,函式是一直存在**的。不論是普通成員函式還是靜態了、常量啦、虛函式啦、純虛函式就不一樣了!在記憶體中都是鏈式結構儲存的。(也有可能有什麼規律但是在我輸出記憶體看的時候並沒有發現)

#include #include using namespace std;

// 可以看到空類編譯時也會分配乙個位元組記憶體,隱含新增記憶體

class a ;

// 類中的成員變數記憶體分布像結構體一樣,有記憶體對齊,並且是連續分配記憶體空間的

class b ;

// 不過其中的char型別成員變數我就沒有看懂了

class c ;

class d

void func2 ()

virtual void func3 ()

};class ownership

void coutaddress ()

// 成員函式有乙個指向自己類的指標,意味著成員函式可以通過呼叫this指標呼叫這個函式自身

void func ()

virtual void func1 ()

//virtual void func2 () = 0;

static void func3 ()

const void func4 ()

const static func5 ()

static const func6 ()

};/*

class sub_for_virtual : public ownership

};/**/

class verifyvar

};class funcstorage

virtual void func1 () {}

static func2 () {}

const func3 () {}

void cout_ ()

};int e = 0;

int f = 1;

int g = 2;

int h = 3;

int main ()

C 動態生成物件

說起c 很多人都覺著難學,其實我也是這麼覺著的,在這個移動端火到爆的時代,我都想改行了,移動端做東西那都是現有的第三方庫,拿來就可以用,而且穩定性好,開發速度快,而且最關鍵的是出東西。在談一談動態生成物件,為什麼強大的c 不支援呢?想用這樣功能的人都必須自己實現一套這樣的邏輯。有時候開發真是有些矛盾...

proc下使用OTT生成物件結構

create or replace type address type as object street varchar2 50 city varchar2 20 state varchar2 20 zipcode varchar2 6 create table customer id number...

C 類的記憶體結構

摘自jerry19880126 沒有複寫的繼承 複寫的繼承 記憶體分布從父類到子類,依次如下 base中有乙個虛表指標 derivedclass1繼承了base,記憶體排布是先父類後子類。derivedclass2的情況是類似於derivedclass1的。derivedderivedclass,由...