物件在記憶體中的長度不一定等於sizeof(member_1) + sizeof(member_2) +...+ sizeof(member_n),因為有三種情況需要考慮:
1.空類:空類中沒有任何資料成員,按理說此類的物件長度為0,則不佔任何空間.但實際情況是,空類的長度為1 byte.如果物件完全不占用任何空間,那麼空類就無法取得例項物件的位址, 則this指標失效,同時也無法例項化.而類的定義是由成員函式和成員資料組成的,在沒有成員資料的情況下還可以有成員函式,因此任然需要例項化,所以空類也分配了乙個位元組用於類的例項化,但這1個位元組資料並沒有被使用.
01 #include
02
03using
namespacestd;
04 05
classctest
06 09 };
10 11
int_tmain(
intargc, _tchar* argv)
12 2.有靜態資料成員的類:靜態資料成員和靜態變數原理相同,都是乙個含有作用域的特殊全域性變數,因此靜態資料成員的初值會被寫入編譯鏈結後的執行檔案中.當程式被載入時,os將執行檔案中的靜態成員資料讀到對應的記憶體單元裡,此時靜態資料成員已經存在,但類還沒有例項化物件.所以靜態資料成員不屬於某一物件,它僅僅是與類相關.即,靜態資料成員也不參與物件長度的計算.
01 #include
02
03using
namespacestd;
04 05
classcstatic
06 ;
12
13intcstatic::m_sint =
0x12345678;
14 15
int_tmain(
intargc, _tchar* argv)
16 使用winhex開啟可執行檔案,並查詢hex value:78563412 即可在找到此靜態資料成員
如下可發現,靜態資料成員並沒有參與物件長度的計算
3.記憶體對齊:類和結構體中的資料成員是根據它們在類或結構體出現的順序依次申請記憶體空間的.由於記憶體對齊的原因,它們排列在記憶體中需要遵守一定的規則.
Object 5 記憶體管理
記憶體管理 object c為每個對像提供乙個內部計數器,這個計數器跟蹤物件的引用次數。所有類都繼承自nsobject的物件retain和release方法 當物件被建立或拷貝的時候,引用計數為1.每次保持物件時候,就傳送一條retain訊息,使其引用計數加1,如果不需要這個物件就傳送乙個relea...
C CLI思辨錄之Object的物件布局
c cli相對純c 來說,支援建立託管引用物件,託管物件由虛擬機器來分配記憶體和管理,程式設計師可以不再擔心記憶體洩漏的問題。其實,說白了也就是相當於自己建立乙個記憶體池,並且虛擬機器實際上也是這樣做的。在cli中,所有的類都從object派生,包括int這樣的值。那麼object的內部結構是怎麼樣...
C CLI思辨錄之Object的物件布局
c cli相對純c 來說,支援建立託管引用物件,託管物件由虛擬機器來分配記憶體和管理,程式設計師可以不再擔心記憶體洩漏的問題。其實,說白了也就是相當於自己建立乙個記憶體池,並且虛擬機器實際上也是這樣做的。在cli中,所有的類都從object派生,包括int這樣的值。那麼object的內部結構是怎麼樣...