C 物件記憶體模型1(堆疊模型)

2022-09-08 08:06:12 字數 1530 閱讀 4618

物件記憶體模型

一. 棧(stack) vs. 堆(heap)

堆 1. myclass c(10); // 棧物件,空間大小在編譯時確定,函式執行結束,系統立即**

2. 

myclass* func()
3.

myclass func()
結論: 指標指向棧物件,就要極度小心,一般會有問題!

myclass* func()
總結返回指標問題:

返回棧指標: 完全錯誤

返回堆指標:釋放可能有問題 ,易造成記憶體洩露

故一般不推薦

5 堆物件記憶體模型

6. 棧物件記憶體模型

二. 變數模型與使用 (物件,指標,引用; 宣告,傳參,返回值)

1. 宣告與符號

「*」 : 宣告時,指標

用在指標前,解指標

「&」: 宣告時,引用

用在物件前,取位址

myclass c;  //物件,一定在棧上

myclass* pc; //指標,要問自己是棧指標,還是堆指標

myclass& c2 = c; //引用,要問自己是棧引用,還是堆引用。本例為棧引用

// 舉例堆引用 myclass *pc2 = new myclass(); myclass& c3 = *pc2; c3為堆引用

c = *pc; //解指標, 可指向堆物件,也可以指向棧物件

//pc指向**,*pc即為指向**的物件(堆/棧)

//又c在棧上 再呼叫拷貝建構函式完成 c = *pc

pc = &c; //取位址

2 傳參分析

//物件

void func1(myclass c)

//指標

void func2(myclass* pc)

//引用

void func3(myclass& mc)

const& 為 pass by value好的替代品

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語言中,資料 和 處理資料的操作 函式 是分開來宣告的,也就是說,語言本身並沒有支援 資料和函式 之...