物件記憶體模型
一. 棧(stack) vs. 堆(heap)
堆 1. myclass c(10); // 棧物件,空間大小在編譯時確定,函式執行結束,系統立即**
2.
myclass* func()3.
myclass func()結論: 指標指向棧物件,就要極度小心,一般會有問題!
myclass* func()總結返回指標問題:
返回棧指標: 完全錯誤
返回堆指標:釋放可能有問題 ,易造成記憶體洩露
故一般不推薦
5 堆物件記憶體模型
6. 棧物件記憶體模型
二. 變數模型與使用 (物件,指標,引用; 宣告,傳參,返回值)
1. 宣告與符號
「*」 : 宣告時,指標
用在指標前,解指標
「&」: 宣告時,引用
用在物件前,取位址
myclass c; //物件,一定在棧上2 傳參分析myclass* pc; //指標,要問自己是棧指標,還是堆指標
myclass& c2 = c; //引用,要問自己是棧引用,還是堆引用。本例為棧引用
// 舉例堆引用 myclass *pc2 = new myclass(); myclass& c3 = *pc2; c3為堆引用
c = *pc; //解指標, 可指向堆物件,也可以指向棧物件
//pc指向**,*pc即為指向**的物件(堆/棧)
//又c在棧上 再呼叫拷貝建構函式完成 c = *pc
pc = &c; //取位址
//物件const& 為 pass by value好的替代品void func1(myclass c)
//指標
void func2(myclass* pc)
//引用
void func3(myclass& mc)
void func3(const myclass& mc)呼叫方法:
myclass c1;返回指標分析:func1(c1); //呼叫拷貝構造
func2(&c1); //不呼叫拷貝構造
3. 返回值分析
返回物件分析:
myclass func1()
myclass* func2()故返回指標一般不推薦
返回引用分析:
myclass& func3()返回傳入引數的引用,ok且推薦,常見還有this指標
myclass& func4(myclass& c)
型別記憶體模型(物件記憶體模型)
型別的記憶體模型的3個問題 1 包含什麼 附加資訊 2 怎麼布局 記憶體對齊 3 使用場景 怎麼使用附加資訊 除了包含結構型別的顯式成員變數外,型別記憶體模型需要解決附加資訊的引入問題 1 附加資訊 opaque 有哪些 型別資訊 函式資訊 繼承資訊 記憶體計數等 2 為什麼有附加資訊 1 解決多型...
c 物件模型1
一 類空間大小及證明 1.乙個沒有任何成員函式的類的空間大小是多少?1位元組2.為什麼是1位元組,而不是0?因為這個類在記憶體中有記憶體位址,這個記憶體位址最少能存1位元組 3.如果這個類新增三個類成員函式,那麼這個類空間的大小是多少?還是1位元組,因為類成員函式不占用類物件的記憶體空間 4.還是給...
C 物件模型 第1章 C 物件模型
多重繼承和虛繼承的記憶體布局 c 物件模型 c 虛函式表解析 c 在布局以及訪問時間上主要的額外負擔是由virtual引起的,包括 1 虛函式機制 2 虛基類 這篇文章不錯,本文幾個圖來自這裡 在 c語言中,資料 和 處理資料的操作 函式 是分開來宣告的,也就是說,語言本身並沒有支援 資料和函式 之...