C 類所佔大小的問題

2021-08-02 02:14:29 字數 1971 閱讀 6399

首先舉乙個例子:

若char是一位元組,int是4位元組,指標型別是4位元組,**如下: 1

2

3

4

5

6

7

8

9

10

11

12

13

classctest

virtualvoidmem_fun(){}

private:

charm_chdata;

intm_ndata;

staticchars_chdata;

};

charctest::s_chdata=』\0』;

問:(1)若按4位元組對齊sizeof(ctest)的值是多少?

(2)若按1位元組對齊sizeof(ctest)的值是多少?

請選擇正確的答案。

分析:(1)在類中,如果什麼都沒有,則類占用乙個位元組,一旦類中有其它成員,則這個位元組就不在計算之類,例如如果乙個類含有乙個int型別,則占用4個位元組而非5個位元組。

(2)如果只有成員函式,則還是只佔乙個位元組,因為類函式不占用空間。

(3)sizeof的本質是得到某個型別的大小,就是建立這個型別的乙個物件(或變數)時,需要為其分配空間的大小。而類也可以理解為int或float這樣的一種型別。當出現static成員變數的時候,靜態成員是儲存在靜態儲存區中的,它是乙個共享的量,所以是這個類例項物件時無需再為static

成員變數分配空間的。

(4)類中一旦有virtual修飾的成員函式,編譯器會構建虛函式表,在該類中會存放乙個指向虛函式表的指標,在 32位機中該指標和其他指標一樣占用4位元組。

若按4位元組對齊sizeof(ctest)的值: 虛函式表 佔乙個指標的空間 4 即virtual

void

mem_fun(){}

char

m_chdata; 1 + 3 對齊  4 

intm_ndata;           4

總共:12

若按1位元組對齊sizeof(ctest)的值: char

m_chdata; 1  已經對齊,其它不變,所以是9。

總結:1.類中一旦有virtual修飾的成員函式,編譯器會構建虛函式表,在該類中會存放乙個指向虛函式表的指標,在 32位機中該指標和其他指標一樣占用4位元組。

2.static作為靜態變數是對類而言的,為所有物件共有,不計算物件的占用空間。

3.神馬都沒有或僅有非虛成員函式的類或僅有型別宣告的類(如typdef),均為空類。對於空類,編譯器會構造占用1位元組空間的變數(通常為char型); 若該類為基類,則繼承自空基類的子類不計算這1位元組的空間,僅計算子類所佔空間(編譯器原理:空基類優化)。 

4.對齊規則,如果注意了題目說明或**開頭的位元組對齊巨集:#pragma pack

類所佔記憶體的大小

成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,類所佔記憶體的大小不包括成員函式的大小,虛擬成員函式除外。同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指...

c 空類所佔記憶體大小問題

先看乙個例子 include using namespace std class a class b class e class c public a class d public b,public c int main cout 為什麼會出現這種結果呢?首先要出需要多少記憶體表現乙個類說起 一般而...

C 中類物件所佔空間的大小

首先,平時所宣告的類只是一種型別定義,它本身是沒有大小可言的。因此,如果用sizeof運算子對乙個型別名操作,那得到的是具有該型別實體的大小。計算乙個類物件的大小時的規律 空類 單一繼承的空類 多重繼承的空類所佔空間大小為 1 位元組,下同 乙個類中,虛函式本身 成員函式 包括靜態與非靜態 和靜態資...