C 類的大小介紹

2022-09-21 21:36:15 字數 2440 閱讀 7023

為什麼講c++類的大小要提到結構體呢,因為可能很多和我一樣的學子,接觸過c語言的結構體對齊,但不明白類的大小怎麼計算,這其中都要用到記憶體對齊的概念,對於記憶體對齊的概念之前已經說過了,可以參考這篇部落格:c++結構體位元組對齊和共用體大小  明白結構體的記憶體大小計算後,就要明白類和結構體的關係:

在c++中,結構體和類的唯一區別就是:結構體和類具有不同的預設訪問控制屬性。

類中,對於未指定訪問控制屬性的成員,其訪問控制屬性為私有型別(private)。

結構體中,對於未指定任何訪問控制屬性的成員,其訪問控制屬性為公有型別(public)。

所以結構體的www.cppcns.com大小和類的大小是一樣的,在c++中,結構體也可以實現實現繼承和多型(可能很驚訝,可以去看看這篇博文:c++結構體與類的區別詳情,還要明確,靜態成員變數和成員函式所占用的空間肯定不是結構體或類的空間。還有就是空的類的大小是1位元組,以方便類進行例項化。

**進行驗證:

#include

using namespace std;

struct node ;

class test;

int main ()

**執行結果為:

繼承允許我們依據另乙個類來定義乙個類,會把乙個類的成員大小都繼承下來,所以繼承了的派生類大小一定要考慮基類的大小,首先考慮的最大對齊數,派生類的最大對齊數要考慮基類的最大對齊數。

下面以實際**進行說明:

#include

using namespace std;

class base

private:

static int m_val1; // 靜態成員不占用類的空間

int m_valint;

char m_valchar;

double m_valdouble;

};class son:public base

private:

int m_sonvalint;

};int main ()

**執行結果為:

可以明確,靜態成員變數和成員函式所占用的空間類的空間,所以base類的最大對齊數為double型別的大小(8位元組),按照順序儲存,

base類的大小計算應該為:

sizeof(base)= 4 + 1 + 3(浪費) + 8 = 1程式設計客棧6位元組

son類繼承了base類,它的最大對齊數也就是8位元組,

所以son類的大小計算應該為:

sizeof(son)  = 4 + 1 + 3(浪費) + 8 + 8 = 24位元組

注意類的也要考慮儲存順序,如果把base類中的m_valchar放到m_valdouble後面,

base類的大小計算就變成了:

sizeof(base)= 4 + 4(浪費)+ 8 + 1 + 7(浪費)= 24位元組

son類的大小就算就變成了:

sizeof(son)= 4 + 4(浪費)+ 8 + 1 + 3(浪費) +  4= 24位元組

由此可以推算出多繼承類的大小計算,菱形繼承也是一樣,都會繼承基類的記憶體,尤其注意虛繼承的情況,虛繼承只是避免了菱形繼承出現的二義性,但不是不繼承,

如以下**:

#include 程式設計客棧

using namespace std;

class base

public:

double m_valdouble;

};class son1:virtual public base{}; //虛繼承

class son2:virtual public base{}; //虛繼承

class grandson:public son1,public son2{};

int mainrhfocun ()

**執行結果為:

上述grandson的依舊為16位元組,因為它從son1繼承來了乙份,又從son2繼承來了乙份,所以,虛繼承只是避免了訪問的二義性,也可見菱形繼承會對記憶體空間造成浪費 。

多型類唯一的區別就是計算類大小要考慮到虛寒表指標的大小,指標的大小和系統相關,32位機器為4位元組,64位機器為8位元組,指標的大小也要作為最大對齊數的考慮範圍。

**說明如下:

#include

using namespace std;

class base;

class son: public base;

public:

int m_sonvalint;

};int main ()

**執行結果為:

base類的大小為8位元組,是因為虛函式表指標占用了4位元組,所以base類的最大對齊數為4位元組,虛函式表在建構函式的時候就會生成,所以,虛函式表指標肯定優先儲存,

所以base類大小的計算為:

sizeof(base) = 4 + 1 + 3(浪費) = 8位元組

則son類的大小計算為:

sizeof(son)= 4 + 1 + 3(浪費) + 4 = 12位元組

c 類的大小

初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗...

C 類的大小

乙個空類class a 的大小為什麼是1,因為如果不是1,當定義這個類的物件陣列時候a objects 5 objects 0 和objects 1 就在同乙個位址處,就無法區分。單繼承 includeusing namespace std class aprivate char k 3 class...

C 類的大小

前言 c 類所占用的記憶體空間實際上是指類的例項所占用的記憶體空間。其大小是由類中的成員變數決定的 靜態成員變數除外 由於成員函式放到 區由類的各個例項共享,故成員函式對類占用記憶體大小沒有影響。具體地說,類占用記憶體大小由以下三個方面決定 1.非靜態成員變數的記憶體占用之和 2.考慮記憶體對其的問...