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.直接繼承的情況下,基類成員變數...