類的學習筆記 一

2021-04-01 17:19:04 字數 1757 閱讀 7840

上課時,老師給我們了乙個小例子,主要學習c++記憶體使用問題!

#include

using namespace std;

class base

public:

virtual void print()   

cout<<"********/n";

};//base class has virtual function

class derived : public base

public:

virtual void print()

cout<<"*****===/n";

};//derived from base

int main()

base *p;

base a;

derived b;

p=&b;

p->print();//print: *****===

cout<<"size of a is "

對於乙個class object,可能的記憶體開銷是:

1-其non-static data member 的總合大小。

2--加上任何由alignment 的需求而填補(padding)上去的空間(可能存在於member 之間,也可能存在於集合體邊界)

3---加上為了支援virtual 而由內部產生的任何額外負擔(overhead)

--------引於《inside the c++ object model》

老師上課舉例為:

class base

public:

virtual void print()   

cout<<"********/n";

這是乙個僅含有乙個virtual member function的類,該類需要維護乙個指向虛表(virtual  table(vtbl))的虛指標(vptr),由於我的執行環境為32位,所以這個vptr 佔據了4bytes。

那麼如果是這樣的類呢?

class a

private:

這是乙個僅含乙個function member 的類,換句話說,這個類不需要維護乙個指向vtbl的vptr。

然而 a a;

產生出來的物件例項a的大小依然不是0,而是1 bytes(在ms vc60中)。

這是因為為了防止兩個物件例項佔據同一塊記憶體空間,(簡單說,防止0 byte 大小的物件例項出現)編譯器為 0 byte 大小的object 安插了乙個char型的變數佔位,有的編譯器為了使匯流排達到最大傳輸效率,會把它對齊為4 bytes,即32位。

如果象這樣,增加乙個int型的nonstatic data member :

class a

private:

int value;

那麼 a a;

得到a的大小是4 bytes而不是5 bytes。因為 a object 的大小不為零,不需要安插char型變數了。

為了驗證以上內容,再舉乙個例子

class a

private:

int value;

這個類有乙個nonstatic data member 和乙個virtual function member 的類,

那麼 a a;

a的大小應該是多少呢?

呵呵,sizeof(a) 的結果是8 bytes

剛好印證了以上說法,4bytes 用於存放vptr,4bytes用於存放int 型 nonstatic data member.

Python學習筆記 類(一)

關於類的概念是我學習以來第一次碰到 物件導向程式設計,隨著學習深入,再進行補充 附上練習 物件導向程式設計 表示小狗的乙個簡單類 class dog 一次模擬小狗的簡單嘗試 def init self,name,age 初始化屬性 name 和 age self.name name self.age...

C 學習筆記 類的繼承(一)

由c 構成的抽象世界存在is a kind of 的關係 例如 在c 裡,由繼承的語法來表示is lind of的關係 class file class videofile public file 語法 class b public a 表示類b繼承於類a,把a稱為父類 基類 把b稱為子類 派生類 ...

類的學習筆記

1.物件 指標和引用的靜態型別決定了我們能夠使用什麼名字的成員,只能使用靜態型別及其基類的成員名字。但呼叫的該名字的成員是動態型別的該成員。2.我們通過panda的物件 引用和指標使用了某個名字,程式會並行的在 endangered和bear zooanimal這兩棵子樹種查詢該名字,如果名字在超過...