2 類在記憶體中是如何分配的

2021-07-11 10:03:54 字數 1154 閱讀 6068

類在記憶體中是如何分配的

乙個類,有成員變數:靜態與非靜態之分;而成員函式有三種:靜態的、非靜態的、虛的。

那麼這些個東西在記憶體中到底是如何分配的呢?

(1)c++中,應該是物件才會被分配記憶體空間吧??為什麼cobject記憶體大小剛好和兩個成員變數的大小之和一致!難道還沒例項化的時候,類就已經有了記憶體空間了?

sizeof(cobject)是在編譯時就計算了的,乙個類定義了,它所佔的記憶體編譯器就已經知道了,這時只是得到它占用的大小,並沒有分配記憶體操作 。也可以這樣想:編譯器肯定知道大小了,這與分配記憶體空間無關,知道大小了,以後例項化了才能知道要分配多大。

(2)當物件生成了之後,算出的記憶體,函式難道不占用記憶體空間嗎?至少應該放個函式指標在裡面的吧?記憶體是怎樣布局的?

類的普通函式和靜態成員函式是不占用記憶體的,至於函式指標,確實有,如果乙個類中存在虛函式,則會自動生成乙個虛函式指標指向虛函式表,這個時候,類的例項便會增加4個位元組。

其實類的成員函式和普通的全域性函式一樣,只不過是在編譯的時候給成員函式新增乙個指向類物件指標的引數,成員函式位址是全域性已知的,根本無須給他乙個函式指標,類中成員函式**都是相同的,如果占用記憶體,則每個例項都開闢空間,這樣會造成大量空間的浪費。

類的屬性是指類的資料成員,例項化乙個物件就會給資料成員分配乙個記憶體空間,而成員函式是共有的,成員函式不占用記憶體

靜態成員函式沒有this指標,因此只能訪問靜態資料,不能訪問非靜態資料成員。總之,程式中所有的**都位於**區。

sizeof是針對例項的,例項的話就看非靜態資料成員,而成員函式是類體的,多個例項呼叫同乙個函式指標,自然不屬於例項的一部分,所以不占用例項的記憶體

(3)靜態成員屬於類嗎,怎麼類的大小中沒有包含靜態成員的大小?

屬於類,但它並不屬於某個物件,類的大小也需要看物件的大小,sizeof看的是物件的大小。

(4)d *d=null;    

d->printa();       

d->printb();        //  printa()為成員函式   printb()為虛函式

類中包括成員變數和成員函式                        

new出來的物件只是為資料成員開闢記憶體空間,成員函式始終存在

所以如果成員函式未使用任何成員變數的話,不管是不是static的,都能正常工作

類在記憶體中的分配

對於乙個宣告好的類,裡面可能有成員函式,靜態成員函式,成員變數,靜態成員變數,虛函式等,那麼這些資料都是怎麼分配到記憶體的呢?class a 乙個簡單的類,方便下面描述資訊 public void show cout i am a 下面給出一些結論以及一些簡單的分析 1.類的普通成員函式以及靜態成員...

類中內容在記憶體中到底是如何分配的呢?

分類 乙個類,有成員變數 靜態與非靜態之分 而成員函式有三種 靜態的 非靜態的 虛的。那麼這些個東西在記憶體中到底是如何分配的呢?以乙個例子來說明 html view plaincopyprint?include iostream.h class cobject void cobject fun c...

類在記憶體中的分配問題

乙個類,有成員變數 靜態與非靜態之分 而成員函式有三種 靜態的 非靜態的 虛的。那麼這些個東西在記憶體中到底是如何分配的呢?以乙個例子來說明 include iostream.h class cobject void cobject fun cobject cobject cobject cobje...