c++是一種物件導向的程式語言,它向下保持了對c的相容,同時也允許程式設計師能夠自由的操控記憶體,雖然會帶來一些問題,但這不是我們要**的問題,略過不表。類是對某種物件的定義,包含變數和方法,也可以理解為現實生活中一類具有共同特徵的事務的抽象,他是物件導向語言的基礎。所以類是不占有記憶體的,可是如果類生成例項那麼將會在記憶體中分配一塊記憶體來儲存這個類。
類的例項在記憶體中是如何分配記憶體的,有什麼需要我們注意的,下面將慢慢到來。
比如下面乙個類:
class a
{};從形式上看,它似乎什麼有沒有,事實上它不止隱含了乙個建構函式和乙個析構函式,還有一些操作符過載函式,比如「=」。如果類a被例項話,如a a;在記憶體會佔據多大的空間呢?有人可能會說4,也有人會說0,還有人會說1,說1的就對了,為什麼會是1呢?原因有很多,如果我們定義乙個陣列a b[10];如果上面是0,這樣的局面將會很尷尬,所以a這樣乙個空類,編譯器會給它乙個位元組來填充。
增加乙個變數,(位元組對齊預設都是4)
class a
類a的例項將佔據4個位元組的記憶體,sizeof(a) = 4
變數i 的初值被編譯器指定位0xcdcdcdcd。
再增加乙個變數,
class a
此時按照變數生命的先後順序,i被放在低位址上,l緊隨其後。
例項占用8個位元組,sizeof(a) = 4*2 = 8
如果累裡面含有函式:
class a
};有些人可能會說類的大小是12,事實上sizeof(a) = 8;
為什麼會這樣,這是因為sizeof訪問的程式的資料段,而函式位址則被儲存在**段內,所以最後的結果是8.
再看下面這個情況
class a;};
此時sizeof(a)大小仍為8,這裡留給讀者去思考為什麼?(^-^)。
當類裡面含有虛函式時,情況會如何呢?
class a
;int add(int x,int y);
};因為含有虛函式,所以類裡面將含有乙個虛指標vptr,指向該類的虛表vtbl,乙個指標占用四位元組的位址,所以sizeof(a) = 12
虛指標放在類例項位址的最低位置,
比如 a *a = new a;
我們可以這樣給變數i賦值
int *p = (int *)a;
p++;
*p = 1;//把i的值賦為1.
如果類作為派生類,記憶體將如何分配呢?
這種情況雖然有些複雜,但並不是說不好理解。
他有多少個父類每個父類的大小加起來在加上自身就是sizeof的大小。
其他相關解釋
a a=new a();
b b=new b();
建立的a是在棧上的她的物件是在堆上 a--->a
a物件的內部物件(非靜態)都存在自己的這個記憶體塊中,然後還有乙個同步索引指標和物件的指標
這個物件的指標是指向自己的型別物件,這個型別物件是分配在載入堆上的,程式初始化就分配好了,這個
物件的靜態物件就是在這個物件中。a--->a--->a型別物件
物件呼叫的方法是存在方法表中。這個表也是在型別物件中(記得不太清了)。
然後每個方法介面在這個方法表中都有一定的排列順序,每個方法占用乙個槽。但是實際的**不是在這裡,是在個什麼堆上。這裡只是方法實現的位址。
b繼承與a,那麼b的型別物件會從a中繼承所有虛方法槽,而且是和夫物件結構一樣的。所以你重寫或new的時候是改變了方法表的結構,對於繼承的虛方法,是通過【物件位址+槽號】確定的,執行時確定物件,槽號編譯時就知道了,而且繼承的結構也一樣,所以實現多型,訪問不同的物件,呼叫不同方法。
對於非虛的方法,比如a的非虛方法是不會在b的方法表中的。但是b卻可以呼叫到a的方法,因為繼承關係。
但是執行時為什麼會去a中找,我還不知道,2個物件繼承非虛方法時是如何聯絡起來的,我不清楚
C 類在記憶體中的分配
在網上看到這樣一道題 答案是24位元組。做這道題要理解三個知識點 一 32位和64位作業系統的區別 32位和64位指的是cpu一次處理資料的能力是32位還是64位,這裡涉及到的是處理器運算位數。簡單的說32位系統的位址匯流排是32位的,而64位系統的位址匯流排是64位的,這意味著乙個指標所占用的空間...
類在記憶體中的分配
對於乙個宣告好的類,裡面可能有成員函式,靜態成員函式,成員變數,靜態成員變數,虛函式等,那麼這些資料都是怎麼分配到記憶體的呢?class a 乙個簡單的類,方便下面描述資訊 public void show cout i am a 下面給出一些結論以及一些簡單的分析 1.類的普通成員函式以及靜態成員...
類在記憶體中的分配問題
乙個類,有成員變數 靜態與非靜態之分 而成員函式有三種 靜態的 非靜態的 虛的。那麼這些個東西在記憶體中到底是如何分配的呢?以乙個例子來說明 include iostream.h class cobject void cobject fun cobject cobject cobject cobje...