對於類物件模型的理解(類大小計算 大小端位元組序)

2021-10-19 01:42:47 字數 1917 閱讀 5648

類:

通俗理解,類相當於乙個模型框架,限定了類有哪些成員變數,但從底層來看,記憶體並沒有分配實際的物理空間來儲存類

物件:

類物件即為類的具體描述,當類物件進行例項化過程中,記憶體將為其分配物理空間

乙個類可以例項化多個物件,例項化出的物件  占用實際的物理空間,儲存類成員變數 

類中有成員變數,以及成員函式,成員函式不佔據記憶體空間,所以在類計算的過程中僅需要計算成員變數即可

但有一點需要注意:乙個空類的大小並不是我們所認為的0,這是為什麼呢?

編譯器在處理空類的時候,將空類的大小給定為1位元組,通過給定1位元組來標識空類

下列**進行測試

// 類中既有成員變數,又有成員函式 

class a1

private:

int _a;

};// 類中僅有成員函式

class a2

};// 類中什麼都沒有---空類

class a3 {};

int main()

對此,類物件大小的計算等同於計算類成員變數大小的計算

模擬結構體計算過程中

結構體內存對齊規則

1. 第乙個成員在與結構體偏移量為0的位址處。即第乙個成員變數不需要考慮對齊  從0位址開始儲存即可

2. 其他成員變數要對齊到對齊數的整數倍的位址處。

注意:對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值vs中預設的對齊數為8

3. 結構體總大小為:最大對齊數(所有變數型別最大者與預設對齊引數取最小)的整數倍

4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處結構體的整體大小就是 所有最大對齊數(含巢狀結構體的對齊數)的整數倍

下面通過**來具體計算一下類大小

class a

;

分析:

int a;佔4位元組    對齊數為4

char b;佔1位元組   對齊數為1

double c;佔8位元組  對齊數為8

int d;佔4位元組    對齊數為4

根據對齊原則:

實際大小為20byte  最後總大小必須為最大對齊數8的整數倍   24byte

1. 結構體怎麼對齊? 為什麼要進行記憶體對齊

結構體對齊的目的就是為了計算機在記憶體讀取更快速,計算機在記憶體中讀取中一次讀取8byte,取決於編譯器預設對齊數

2. 如何讓結構體按照指定的對齊引數進行對齊

#pragma  pack(所設定對齊數)

3. 如何知道結構體中某個成員相對於結構體起始位置的偏移量

強制型別轉化為char*    取位址相減

4. 什麼是大小端?如何測試某台機器是大端還是小端,有沒有遇到過要考慮大小端的場景 

大小端測試:

(1)指標法測試:

(2)聯合體測試

c 類大小計算

先給出總結 以下測試均在x64系統執行 1 原則1 空類的大小為1位元組。includeusing namespace std class a int main int main virtual void fun2 int test1 static void test2 static int c s...

C 類的大小計算

1.空類的大小 class c2 結果 sizeof c2 1 分析 這是因為當我們例項化乙個類物件時,就是為其分配記憶體空間,並且每乙個例項化的類都會有乙個獨一無二的記憶體位址,空類也不例外,必須為其分配乙個記憶體,因此編譯器給分配了乙個位元組的記憶體,使其獨一無二。2.只含有乙個虛函式的類的大小...

C 學習 c 類大小計算

涉及到c 中求類大小時需要特別注意一下幾點 為類的非靜態成員資料的型別大小之和。有編譯器額外加入的成員變數的大小,用來支援語言的某些特性 如 指向虛函式的指標 虛繼承 多重繼承 為了優化訪問效率,進行的邊緣調整。與類中的建構函式,析構函式以及其他的成員函式無關。5.私有繼承,會去繼承之前的私有成員變...