1.轉型其實是一種編譯器指令, 大部分情況下它並不改變乙個指標所含的真正位址,它只影響"被指出之記憶體的大小和內容"的解釋方式.
2.global objects的記憶體保證會在程式啟動的時候被清為0, local objects配置於程式的堆疊中, heap objects配置於自由空間中, 都不一定會被清為0, 它們的內容將是記憶體上次被使用後的遺跡.
eg.class
test
;test
g_obj
;void
main
()物件g_obj中變數均被初始化為0, l_obj和h_obj中變數均未被初始化.
3.以下情況下編譯器會生成預設建構函式:
1)帶有預設建構函式的成員變數
eg.class
object
private
: int
val;};
class
test
;void
main
()vs中debug我們可以看到物件t定義,編譯器生成了test的預設建構函式
呼叫建構函式進行了一次跳轉
具體建構函式體,函式內呼叫了物件object的建構函式
2)基類帶有預設建構函式
3)帶有虛函式的類物件
4)帶有虛繼承的類物件
4.拷貝建構函式不會直接進行位元組拷貝操作情況.
1)當類內含乙個成員變數是類物件,而後者類內宣告有乙個拷貝建構函式
2)當類繼承自乙個含有拷貝建構函式基類
3)當類宣告了乙個或多個虛函式
4)當類的繼承體系中存在乙個虛繼承時.
5.建構函式初始化列表中成員變數初始化的順序是以成員變數在類中的宣告順序進行的,並不是以初始化列表中的順序進行初始化.
6.msvc中物件的虛函式指標放在物件的頭端,如下:
虛函式表中正向索引為虛函式, 負索引為虛基類的偏移量.
7.物件建構函式進行操作
1)呼叫base class constructor,順序為從最底層到上層;
2)設定virtual table ptr;
3)按照成員在類中的宣告順序,初始化member initialization list中所列的成員;
4)呼叫使用者所寫**;
8.析構函式進行操作;
1)呼叫destructor中使用者**首先執行;
2)class中擁有member class objects,且擁有destructors,則以宣告的順序相反的順序被呼叫;
3)物件中含有virtual table ptr,則會被重新設定為適當的基類的虛函式表指標;
4)如果有任何直接的nonvirtual base classes 擁有destructor它們會以其宣告順序的相反順序被呼叫;
5)如果任何virtual base classes擁有destructor,而當前討論的這個class是最尾端的class,那麼它們會以其原來的構造順序的相反順序被呼叫.
《深度探索c 物件模型》學習筆記
封裝並未給c 帶來任何的空間或執行期的不良後果,c 在布局和訪問時間上的主要額外負擔由虛擬化引起。包括 1 virtual function機制。用以支援乙個有效率的 執行期繫結 2 virtual base class機制。用以實現 多次出現在繼承體系中的base class,有乙個的單一而被共享...
深度探索c 物件模型學習筆記之物件
在c 中,有兩種資料成員 靜態的和非靜態的,以及三種類成員函式 靜態的 非靜態的和虛函式。已知如下class point宣告 class point 考慮乙個問題,class point在機器中是怎麼表現的呢?簡單物件模型 簡單物件模型,是為了降低c 編譯器的設計複雜度,賠上了空間和執行器的效率而開...
《深度探索c 物件模型》學習筆記 附錄
1.關於整個書,我覺得如果能夠把各種類的 sizeof 搞定,就肯定 ok了。所以請參看另一篇文章 sizeof 大全 物件在記憶體中的布局 不考慮 padding 太複雜 只使用 int,並假設 sizeof int 4byte ide 是vc6.0 類 記憶體 類 記憶體 1 class a c...