類和物件(11) 編譯器對屬性和方法的處理機制

2022-08-12 10:45:07 字數 1964 閱讀 9443

乙個空的class在記憶體中多少位元組?如果加入乙個成員函式後是多大?這個成員函式儲存在記憶體中什麼部分?

乙個class物件需要占用多大的記憶體空間。最權威的結論是: 

(1)空類的size

class

car;

void

main()

編譯器在執行car objcar;這行**後需要,作出乙個class car的object。並且這個object的位址還是獨一無二的,於是編譯器就會給空類建立乙個隱含的乙個位元組的空間。

(2)只有成員變數的size

class

car;

void

main()

在32位系統中,整型變數佔4個位元組。這裡class car中含有兩個整型型別的成員變數,所以class size是8。

class

car;

void

main()

;void

main()

在類中又插入了乙個字元型變數,結果class size變成了12。這個就是編譯器額外新增3個字元變數,做資料對齊處理,為了是提高cpu的計算速度。編譯器額外新增的東西我們是無法看見的。這也符合了結論中的第二條:加上編譯器為了cpu計算,作出的資料對齊處理。 

既然,我們這樣定義類成員資料編譯器會額外的增加空。那麼,我們何不在定義類的時候就考慮到資料對齊的問題,可以多定義出3個字元型別變數作為預留變數,既能滿足資料對齊的要求,也給自己的程式新增了一些可擴充套件的空間。

(3)只有成員函式的size

class

car;

~car() {};

void

fun() {};

};void

main()

噢,這是怎麼回事兒呢?再做乙個實驗看看。

class

car;

~car() {};

void

fun() {};

private

:

intnlength;

intnwidth;

};void

main()

;

virtual ~car() {};

void

fun() {};

};void

main()

這次,讓析構函式為虛函式,看到了class size為4。這正是指向virtual table的指標vptr的size。這正好符合了,結論中的第三條:加上為了支援虛函式,產生的額外負擔。

#include using

namespace

std;

class

c1;//

12class

c2

void setk(int

val)

};struct

s1;//

12structs2;

//12

intmain()

通過上面的案例,我們可以的得出:  

c++類物件中的成員變數和成員函式是分開儲存的。

成員變數:

普通成員變數:儲存於物件中,與struct變數有相同的記憶體布局和位元組對

齊方式;

靜態成員變數:儲存於全域性資料區中;

成員函式:儲存於**段中。

1、c++類物件中的成員變數和成員函式是分開儲存的。c語言中的記憶體四區模

型仍然有效!

2、c++中類的普通成員函式都隱式包含乙個指向當前物件的this指標。

3、靜態成員函式、成員變數屬於類。

4、靜態成員函式與普通成員函式的區別:

靜態成員函式不包含指向具體物件的指標;

普通成員函式包含乙個指向具體物件的指標 。

C 編譯器對屬性和方法的處理機制

1 c 類中的成員函式和變數時分開儲存的 成員變數 普通成員變數,儲存於物件中,與struct變數有相同的記憶體布局和位元組對齊方式 靜態成員變數,儲存於全域性資料區中 成員函式,儲存於 區中 2 c 編譯器對普通成員函式的內部處理 總結1.c 類物件中成員變數和成員函式總是分開。c語言中記憶體四區...

類和物件,方法和屬性

1.什麼是類 類是由一組相同的屬性和方法的物件組成的集合。2.什麼事物件 物件是用來描述客觀事物的乙個實體,由一組屬性和方法構成的。3.方法和屬性的概念 3.1屬性物件具有的各種特徵。3.2方法是物件執行的操作。4.什麼是方法過載 1.同乙個類中方法名一樣2.引數列表不一樣 引數個數不同,引數型別不...

c 編譯器對屬性和方法的處理機制一

通過上面的案例,我們可以的得出 1 c 類物件中的成員變數和成員函式是分開儲存的 成員變數 普通成員變數 儲存於物件中,與struct變數有相同的記憶體布局和位元組對齊方式 靜態成員變數 儲存於全域性資料區中 成員函式 儲存於 段中。如下,注意看注釋 include iostream using n...