每個oc物件都佔據著某個記憶體區域,因為例項變數的個數及物件所包含的關聯資料互不相同,所以每個物件所佔的記憶體區域大小也是有大有小,塊本身也是物件,在存放塊物件的記憶體區域中,首個變數是指向class物件的指標,該指標叫做isa。其餘記憶體裡含有塊丟向正常運轉所需的各種資訊。
如下:塊
void*
isaint
flags
intreserved
void(*)(void,*..)
invoke
struct*
descriptor
捕獲到的變數
下圖為descriptor裡的結構描述
塊描述符
unsigned long int
reserved
unsigned long int
size
void (*)(void *,void*)
copy
void(*)(void*,void*)
dispose
在記憶體布局中,最重要的就是invoke變數,這是個函式指標,只想塊的實現**,函式原型至少接受乙個void*型的引數,此引數代表塊。剛才說過,塊其實就是一種代替函式指標的語法結構,原來使用函式指標時,需要用「不透明的void指標」來傳遞狀態。而改用塊之後,則可以把原來用標準c語言特性所編寫的**封裝成簡明且易用的介面。
descriptor變數是只像結構體的指標,每個塊裡都包含此結構體,其中宣告了塊物件的總體大小,還宣告了copy與dispose這兩個輔助函式所對應的函式指標。輔助函式在拷貝及丟棄塊物件時執行,其中會執行一些操作,比方說,前者要保留捕獲的物件,而後者將之釋放。
塊還會把它所捕獲的所有變數都拷貝乙份,這些拷貝放在descriptor變數後面,捕獲了多少個變數,就要佔據多少記憶體空間,請注意,拷貝的物件不是物件本身,而是指向這些物件的指標變數。invoke函式為何需要把塊物件作為引數傳進來呢?原因就在於,執行塊時,要從記憶體中把這些捕獲到的變數讀出來。
這裡只是幫助理解塊物件的內部的結構,實際用處感覺不大。
HBase內部結構
table表 就是有乙個或者多個列族組成,加上之前的 使用,這個表概念應該很熟了 row行 乙個行包括了多個列,這些列通過列族來分類 column family列族 列族是多個列的集合,hbase會盡量的將乙個列族的列放入同乙個伺服器內,這樣可以提高訪問效能,並且可以批量管理有關聯的一堆列,所有的資...
Oracle檢視內部結構
1 分析資料檔案塊,轉儲資料檔案n的塊m alter system dump datafile n block m 2 分析日誌檔案 alter system dump logfile logfilename 3 分析控制檔案的內容 alter session set events immediat...
MFC內部結構剖析
mfc內部結構剖析 mfc程式的執行順序依次是 程式在載入main函式之前,會先為全域性變數和全域性物件分配記憶體空間。afxwinmain函式 winmain函式實際上是通過呼叫afxwinmain函式來完成它的功能的。afxwinmain呼叫afxgetthread函式獲得乙個cwintread...