物件模型是物件導向程式設計語言的乙個重要方面,它會直接影響物件導向語言編寫程式的執行機制及對內在的使用機制,因此了解物件模型是進行程式優化的基礎。分析一般意義上程式中的資料在記憶體中的分布,以及程式使用的不同種類的記憶體等基本的概念。了解物件的生命週期,以及物件的記憶體布局。只有通過深入的學習c++物件模型,才能避免程式開發中一些不易察覺的記憶體錯誤 。從而達到改善程式效能,提高程式的質量。
程式使用記憶體區
乙個種序占用的記憶體區一般分為,全域性(靜態)資料區,常量資料區,**區,棧,堆,我們所編寫的程式就放在**區中,而程式的資料要根所相應的資料型別,儲存至不同的記憶體區中,在c++語言中,資料有不同的分類方法,例如常量和變數,全域性資料和區域性資料,以及靜態資料和非靜態資料.另外,還有程式執行過程中動態產生和釋放的資料,這些資料放在不同的資料區中。
全域性(靜態)資料區儲存全域性變數及靜態變數(包括全域性靜態變數和區域性靜態變數)。
常量資料區中儲存程式中的常量字串等。
棧中儲存自動變數或者區域性變數,以及傳遞的函式引數等,而堆是使用者程式控制的儲存區,儲存動態產生的資料。
通過memory.cpp來測試可以清晰看出,記憶體區的資料的存放
#include
<
stdio.h
>
#include
<
stdlib.h
>
intnglobal
=100
;intmain(
void
)...
輸出為:
global variable: 0x417000
static variable: 0x417004
local expression 1: 0x4158d4
local expression (const) : 0x4158c4
new: 0x32a10
malloc: 0x32a50
//邊界對齊通過new申請了5個整數需要的記憶體,通過malloc申請了1個位元組。這裡的位址相差32個位元組,如果按正常算應該是20個位元組為0x14,malloc申請位址應該從new後的20個位元組32a24開始,但佔據32個位元組的記憶體(0x32a10~0x32a50),即在記憶體分配時按16個位元組對齊。
local pointer(pnew): 0x13ff30
local pointer(plocalstring2): 0x13ff54
local pointer(plocalstring1): 0x13ff60
local variable(nlocal): 0x13ff48
local pointer(pmalloc): 0x13ff24
local const variable: 0x13ff3c
記憶體對齊方式雖然浪費一些記憶體,但由於cpu在對齊方式下執行比較快,簡化了處理器和儲存器系統之間介面的硬體設計。如,假設處理器總是從儲存器中取8個位元組出來,則位址必須為8的倍數。如果我們能合保證所有的double都將它們的位址對齊成8的倍數,那麼就可以用乙個儲存器操作來讀或寫值了。否則,我們可能需要執行兩次儲存器訪問,因為物件可能分放在兩個8位元組儲存器塊中。
C 物件模型之記憶體布局
c 虛函式表解析 虛函式按照其宣告順序放於表中 父類的虛函式在子類的虛函式前面 覆蓋的函式被放到了虛表中原來父類虛函式的位置 沒有被覆蓋的函式依舊 每個父類都有自己的虛表 子類的成員函式被放到了第乙個父類的表中 所謂的第乙個父類是按照宣告順序來判斷的 待補充 c 物件模型之記憶體布局 1 c 物件模...
C 物件模型之記憶體布局(2)
多重繼承 繼承關係大於2,至少有父類,子類,孫子類三代關係。使用vs2017檢視物件記憶體布局如下 class c size 20 0 base class b 0 base class a 0 4 a1 8 a2 12 b1 16 c1 c vftable c meta 0 0 c a1 1 a ...
c 之記憶體模型
c 程式在執行時,將記憶體大方向劃分為4個區域 區 存放函式體的二進位制 由作業系統進行管理 你寫的 都轉化成二進位制 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配和釋放,存放函式的引數值,區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 記...