C 類的儲存結構

2021-06-06 21:26:47 字數 1948 閱讀 3235

c++類的儲存(部分可用與c 的結構體)

**:c++中最重要的就是類,那麼給你乙個類的物件,你知道它在記憶體中如何儲存的嗎?它佔

記憶體中多少個位元組?

首先確定類的構成:

1,資料成員:可以是內建型別,類型別。

2,函式成員:虛函式,非虛函式

1)資料成員

內建型別對齊原則

內建型別就是常用的:char,short,long,int,float,double.

這些內建型別在類的物件中對齊方式,位元組為單位(在c 中結構體也是一樣的)

char 1

short 2

long 4

int 4

float 4

fouble 8

類型別對齊原則(c 中就是結構體對齊原則)

取類中最長的資料成員作為對齊原則。例如,類中最長為 double,那麼就是8 個位元組。

2)函式成員

函式成員是不占用記憶體中類的物件的位元組。為什麼呢,你可以這樣理解,c++中為了相容c

也允許struct 作為類的宣告。在c 中struct 是用來宣告結構體型別的,只不過c 中的結構

體沒有函式成員。

同樣 c++中允許的函式成員,只不過是類給函式提供了乙個作用域。

乙個物件呼叫函式的時候,可以等價為普通函式的呼叫

例如:struct a

所以物件中並不需要儲存函式成員。

下面舉個例子說明類物件的位元組數

1,class a

;a a;

這物件a 的記憶體大小sizeof(a)=8(位元組為單位)

解釋下:

c 放在起始位置0,佔1 個位元組。

i 是int 要4 位元組對齊,所以前面要空3 位元組。它要從位置4 開始儲存,佔4,5,6,7 四

個位置。

最後類要按照他最長的資料成員對齊,就是i 也就是4 位元組對齊.因為已經占用了8 個位元組,

8 是對齊4 的,所以不用額外增加位元組數了。最後sizeof(a)=8。

2,class b

;b b;

這物件b 的記憶體大小sizeof(b)=24(位元組為單位)

解釋:d 放在起始位置0 到7,佔8 個位元組。

c 是char 要1 位元組對齊,所以放在位置8,佔1 個位元組。

b 是類型別,在1 中可以知道它是8 位元組對齊的,所以前面要空7 個位元組,它從位置16

開始儲存,一直到23,佔8 個位元組。

最後類要按照他最長的資料成員對齊,就是d 也就是8 位元組對齊,因為已經占用了24 個字

節,24 是對齊8 的,所以不用額外增加位元組數了。最後sizeof(a)=24。

3,class c

;c c;

你知道sizeof(c)=多少嗎? 答案:24.不解釋了~。(注意這個最後需要額外增加空間來

對齊類)

上面講的,你同樣可以使用 c 中的結構體型別變數的位元組數計算。

下面說下特殊的,就是 c 中沒有的。

1,類中有虛函式的時候

我們在一開始的時候,就說了成員函式中有虛函式。c++為了處理多型,所以引入虛函式,

在乙個類物件儲存空間中,第乙個位置需要4 個位元組來儲存乙個指標。這個指標是指向改

類的虛函式表的。也就是這個指標的值就是改類的虛函式表的位址。所以就比上面說的多了

4 個位元組。

例如:class d

;double d;

}d d;

sizeof(d)=16;

2,派生類記憶體大小

例如:class e:d

;e e;

sizeof(e)=32;

解釋:基類中有虛函式,所以派生類物件一開始要 4 個位元組儲存指向虛函式表的指標。

然後繼承 d 中的資料成員double d;

它要8 位元組對齊,所以前面空4 個位元組。

下面就開始儲存 d0,c,d1.最後類對齊可計算得到32.

類的儲存結構

每次想 下類的儲存結構,總是不得而知,現在終於弄通了,現在解析如下 首先類本身是不佔記憶體的,但是類本身是有大小的,只有類的例項才能佔記憶體。類的元素分為兩種 類的成員變數 儲存在棧區 類的函式 儲存在 區 但是涉及到繼承和virtual就要重新考慮了。1.有虛函式 實繼承的情況 儲存區位置分布 指...

C 的儲存類

儲存類定義 c 程式中變數 函式的範圍 可見性 和生命週期。這些說明符放置在它們所修飾的型別之前。下面列出 c 程式中可用的儲存類 從 c 11 開始,auto 關鍵字不再是 c 儲存類說明符,且 register 關鍵字被棄用。自 c 11 以來,auto關鍵字用於兩種情況 宣告變數時根據初始化表...

GCC編譯環境C 類物件儲存結構

嚴謹宣告以下結論均為gcc編譯和unix 64位系統環境下得出的結論,非gcc和unix環境結論部分結論可能有所不同 1.c 類成員變數分為兩部分 類自身宣告的成員變數,來自於基類的成員變數 2.成員變數在記憶體中的順序和宣告順序保持一致,從低位址向高位址擴充套件 3.直接繼承的情況下,基類成員變數...