乙個空的class在記憶體中多少位元組?如果加入乙個成員函式後是多大?這個成員函式儲存在記憶體中什麼部分?
乙個class物件需要占用多大的記憶體空間。最權威的結論是:
(1)空類的size
classcar;
void
main()
編譯器在執行car objcar;這行**後需要,作出乙個class car的object。並且這個object的位址還是獨一無二的,於是編譯器就會給空類建立乙個隱含的乙個位元組的空間。
(2)只有成員變數的size
classcar;
void
main()
在32位系統中,整型變數佔4個位元組。這裡class car中含有兩個整型型別的成員變數,所以class size是8。
classcar;
void
main()
;void
main()
在類中又插入了乙個字元型變數,結果class size變成了12。這個就是編譯器額外新增3個字元變數,做資料對齊處理,為了是提高cpu的計算速度。編譯器額外新增的東西我們是無法看見的。這也符合了結論中的第二條:加上編譯器為了cpu計算,作出的資料對齊處理。
既然,我們這樣定義類成員資料編譯器會額外的增加空。那麼,我們何不在定義類的時候就考慮到資料對齊的問題,可以多定義出3個字元型別變數作為預留變數,既能滿足資料對齊的要求,也給自己的程式新增了一些可擴充套件的空間。
(3)只有成員函式的size
classcar;
~car() {};
void
fun() {};
};void
main()
噢,這是怎麼回事兒呢?再做乙個實驗看看。
classcar;
~car() {};
void
fun() {};
private
:
intnlength;
intnwidth;
};void
main()
;
virtual ~car() {};
void
fun() {};
};void
main()
這次,讓析構函式為虛函式,看到了class size為4。這正是指向virtual table的指標vptr的size。這正好符合了,結論中的第三條:加上為了支援虛函式,產生的額外負擔。
#include usingnamespace
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...