上課時,老師給我們了乙個小例子,主要學習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這兩棵子樹種查詢該名字,如果名字在超過...