C++類對象的大小(1)
1、 類的大小計算的時候,只包括以下內容:
1 類的非靜態成員數據的類型大小之和.
2 如果有虛函數的話,還要加上指向虛函數的指針(vptr)大小
3 基類大小
4 邊緣調整(字節對齊)后的大小
5 與類中的構造函數,析構函數以及其他的成員函數無關.
2、空類的大小
空類的大小為1
#include
1
2
3
4
5
6
7
8
9
10
11
輸出結果:1
為什么空類的大小為1呢:
深度探索c++對象模型中是這樣說的:
那是被編譯器插進去的一個char ,使得這個class的不同實體(object)在內存中配置獨一無二的地址。
也就是說這個char是用來標識類的不同對象的,通俗點講就是:你有一套房,房子面積不能為0吧,為0的話,那就說明你沒有房;
從網上找到我個人比較滿意的答案:這就是實例化的原因(空類同樣可以被實例化),每個實例在內存中都有一個獨一無二的地復址,為了達到這個目的,編譯器往往會給一個空類或空結構體(C++中結構體也可看為制類)隱含的加一個字節,這樣空類或空結構體在實例化后在內存得到了獨一無二的地址,所以空類所占的內存大小是1個字節zd。
3、類的成員函數,不占類對象的大小
C++程序的內存格局通常分為四個區:全局數據區(data area),代碼區(code area),棧區(stack area),堆區(heap area)(即自由存儲區)。全局數據區存放全局變量,靜態數據和常量;所有類成員函數和非成員函數代碼存放在代碼區;為運行函數而分配的局部變量、函數參數、返回數據、返回地址等存放在棧區;余下的空間都被稱為堆區。根據這個解釋,我們可以得知在類的定義時,類成員函數是被放在代碼區,而類的靜態成員變量在類定義時就已經在全局數據區分配了內存,因而它是屬于類的。對于非靜態成員變量,我們是在類的實例化過程中(構造對象)才在棧區或者堆區為其分配內存,是為每個對象生成一個拷貝,所以它是屬于對象的。
當我們實例化一個對象的時候,因為這個對象是用類定義的,那么它理所當然擁有了這個類的數據和函數。但是,一般情況下,不同的對象,他們的的數據值不同,但是函數的代碼都相同。所以,為了節約存儲空間(想象一下我們如果定義了100個對象,那么用100段內存空間存儲相同的代碼,豈不是很浪費?),我們讓成員函數的代碼共享。
我們把成員函數的代碼存儲在對象空間之外。換句話說,成員函數的代碼,都不占據對象的存儲空間。它會被存在其他地方。
C++
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。