C C 中類的儲存方式

2021-06-05 12:48:05 字數 2571 閱讀 3714

一、簡單物件的儲存

1、   基本型別對齊原則:

char            1

short          2

int              4

long            4

float            4

double        8

2、   結構體型別對齊原則:

以最大成員型別的對齊方式為準,即當需要增長時,增長最大成員型別所占用的位元組數。

3、   靜態成員變數不占用類物件的儲存空間原則:

靜態成員變數所有的類物件共享乙份,在靜態區域中,並不占用類物件的空間。

4、 沒有任何成員變數的類物件占用乙個位元組的空間

#include using namespace std;

/*沒有任何資料成員的物件類占用乙個位元組的空間*/

class a1;

/*靜態資料成員不占用類物件的儲存空間*/

class a2;

/*當只有char型別時,以1個位元組為單位對齊*/

class b1;

/*與a比較發現,當最大為short時,以2個位元組為單位對齊*/

class b2;

/*與a比較發現,當最大為int時,以4個位元組為單位對齊*/

class b3;

/*與a比較發現,當最大為double時,以8個位元組為單位對齊*/

class b4;

/*與a比較發現,當最大為double時,以8個位元組為單位對齊*/

class b5;

/*c s i 佔4個位元組,d佔4個位元組*/

class c1;

/*d佔4個位元組,c s i 佔4個位元組*/

class c2;

/*c佔1個位元組,d從下乙個4位元組開始佔4個位元組,s i在下乙個4位元組中*/

class c3;

/*c s 在頭4個位元組中,d佔下四個位元組,i 在最後4個位元組中*/

class c4;

int main()

輸出:size of a1 : 1

size of a2 : 1

size of b1 : 2

size of b2 : 4

size of b3 : 8

size of b4 : 8

size of b5 : 12

size of c1 : 16

size of c2 : 16

size of c3 : 20

size of c4 : 16

二、繼承下的物件儲存

1、虛表指標占用4個位元組原則

對於乙個類而言,在不存在虛函式的情況下,類的大小等於成員大小之和(按照對其原則),當存在虛函式時,由於要儲存虛表指標,故多占用4個位元組。

2、子類共享父類的虛表指標原則

在普通繼承下,子類與父類共享乙個虛表,子類不需要另外新增記憶體。

3、虛基類表指標占用4位元組原則

在虛繼承的情況下,繼承了多個繼承了同乙個父類的中間類的子類只儲存了乙個同他基類的備份,但每個中間類都需要需要儲存指向基類表的指標來指向共同的基類。

#include using namespace std;

class a1;

/*與a1比較,存在虛函式的情況下,需要儲存虛函式表指標佔4個位元組*/

class a2;

/*與a2比較,當不存在不同於父類的虛函式時,子類與父類共享儲存虛函式表的指標*/

class b1 : a2;

/*與a2比較,當存在不同於父類的虛函式時,子類與父類共享儲存虛函式表的指標*/

class b2 : a2;

/*與b1比較,虛繼承需要儲存指向虛基類表的指標佔4個位元組*/

class b3 : virtual a2;

/*虛繼承下,若子類中有不同於父類的虛函式,則需要不同於父類的指向虛函式表的指標*/

class b4 : virtual a2;

/*虛繼承下,共同的基類只有乙個備份,但每個虛繼承的類中多了乙個只想那個虛基類表的指標*/

class c1 : b3, b4;

int main()

輸出:

sizeof a1 is : 4

sizeof a2 is : 8

sizeof b1 is : 12

sizeof b2 is : 12

sizeof b3 is : 16

sizeof b4 is : 16

sizeof c1 is : 28

c的記憶體分布:

b3指向虛基類表的指標             4

b3自己的儲存區域                 4

b4自己的指向虛函式表的指標       4

b4指向虛基類表的指標             4

b4自己的儲存區域                 4

c1自己的儲存區域                 4

基類的儲存區域                   8

原文:

c c 變數的儲存方式

前面已經介紹了,從變數的作用域 即從空間 角度來分,可以分為全域性變數和區域性變數。從另乙個角度,從變數值存在的作時間 即生存期 角度來分,可以分為 靜態儲存方式和動 態儲存方式。使用者儲存空間可以分為三個部分 程式區 靜態儲存區 動態儲存區。全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性...

C C 浮點數在記憶體中的儲存方式

任何資料在記憶體中都是以二進位制的形式儲存的,例如乙個short型資料1156,其二進位制表示形式為00000100 10000100。則在intel cpu架構的系統中,存放方式為 10000100 低位址單元 00000100 高位址單元 因為intel cpu的架構是小端模式。但是對於浮點數在...

C C 浮點數在記憶體中的儲存方式

任何資料在記憶體中都是以二進位制的形式儲存的,例如乙個short型資料1156,其二進位制表示形式為00000100 10000100。則在intel cpu架構的系統中,存放方式為 10000100 低位址單元 00000100 高位址單元 因為intel cpu的架構是小端模式。但是對於浮點數在...