C 類在記憶體中的分配

2021-07-24 12:53:04 字數 2104 閱讀 3195

在網上看到這樣一道題:

答案是24位元組。

做這道題要理解三個知識點:

一、32位和64位作業系統的區別:32位和64位指的是cpu一次處理資料的能力是32位還是64位,這裡涉及到的是處理器運算位數。簡單的說32位系統的位址匯流排是32位的,而64位系統的位址匯流排是64位的,這意味著乙個指標所占用的空間是64位即8個位元組。

二、sizeof是用來計算棧大小,不涉及全域性區,所以類的靜態成員大小sizeof不計算。也就是說,類的成員變數中,只考慮a、p、func1、func2。

三、c++類在記憶體中的空間分配,這也是本文講述的重點,下面著重闡述。

首先看下面這段**:

#include 

using

namespace

std;

class test

int t;

}; int main()

三個輸出結果分別是2358848–2358848、4–4和5。來看看這三個輸出分別代表什麼意義。

第乙個輸出&test代表的是類物件的位址,為2358848,與之對比的是&test.t代表的是test物件的唯一乙個成員變數t的位址,發現和&test一模一樣,說明類的位址就是類的第乙個成員變數的位址。

第二個輸出對比的是類占用的棧空間大小和類中唯一乙個成員變數的大小,均為4,即乙個int變數的大小,說明類的大小取決於類中成員變數的大小。

第三個輸出為類的指標指向的值,為5,正好是類物件中成員變數t的值,說明類的位址對應類的某乙個成員變數的值。

那麼問題來了,如果類中沒有成員變數呢,是不是類的大小就是0了呢?來試試這段**:

#include 

using

namespace

std;

class test

{};

int main()

輸出為1和603866880,可見即使類中沒有成員變數,其大小也不會是0,這是有實際意義的,如果大小為0,那麼空類陣列的記憶體分配會比較麻煩。後面輸出該類位址對應的值,為隨機數,說明雖然大小為1,但是那個記憶體空間的值是隨機的。

注意點2:類的成員函式不占用棧空間。

所有的函式都是存放在**區的, 不管是全域性函式,還是成員函式,靜態函式。所以類的成員函式是不占用棧的空間的,這很好理解,設想我們隨便建立乙個類,c++會自動生成預設建構函式和析構函式等一系列函式,這部分在我們之前測試類大小的時候並沒有體現出來。

類本身是不占有記憶體的,可是 如果類生成例項那麼將會在記憶體中分配一塊記憶體來儲存這個類。

所以a這樣乙個空類,編譯器會給它乙個位元組來填充。

在c++中,如果類中有虛函式,那麼它就會有乙個虛函式表的指標__vfptr,在類物件最開始的記憶體資料中。之後是類中的成員變數的記憶體資料。

對於子類,最開始的記憶體資料記錄著父類物件的拷貝(包括父類虛函式表指標和成員變數)。 之後是子類自己的成員變數資料。

對於子類的子類,也是同樣的原理。但是無論繼承了多少個子類,物件中始終只有乙個虛函式表指標。

子類的虛函式表中,先存放基類的虛函式,在存放子類自己的虛函式。

當子類過載了父類的虛函式,則編譯器會將子類虛函式表中對應的父類的虛函式替換成子類的函式。

(1) 對於基類,如果有虛函式,那麼先存放虛函式表指標,然後存放自己的資料成員;如果沒有虛函式,那麼直接存放資料成員。

(2) 對於單一繼承的類物件,先存放父類的資料拷貝(包括虛函式表指標),然後是本類的資料。

(3) 虛函式表中,先存放父類的虛函式,再存放子類的虛函式

(4) 如果過載了父類的某些虛函式,那麼新的虛函式將虛函式表中父類的這些虛函式覆蓋。

(5) 對於多重繼承,先存放第乙個父類的資料拷貝,在存放第二個父類的資料拷貝,一次類推,最後存放自己的資料成員。其中每乙個父類拷貝都包含乙個虛函式表指 針。如果子類過載了某個父類的某個虛函式,那麼該將該父類虛函式表的函式覆蓋。另外,子類自己的虛函式,儲存於第乙個父類的虛函式表後邊部分。

(6) 當物件的虛函式被呼叫是,編譯器去查詢物件的虛函式表,找到該函式,然後呼叫。

類在記憶體中的分配

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

c 類例項在記憶體中的分配

c 是一種物件導向的程式語言,它向下保持了對c的相容,同時也允許程式設計師能夠自由的操控記憶體,雖然會帶來一些問題,但這不是我們要 的問題,略過不表。類是對某種物件的定義,包含變數和方法,也可以理解為現實生活中一類具有共同特徵的事務的抽象,他是物件導向語言的基礎。所以類是不占有記憶體的,可是如果類生...

類在記憶體中的分配問題

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