初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的**與最終生編譯成的**卻大相徑庭,我們並不知道編譯器在後台做了什麼工作.這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗,是編譯器這方面的乙個具體功能.
首先:我們要知道什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址.
那我們先看看乙個例子:
#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位的,這意味著乙個指標所占用的空間...