關於為什麼會有偏移一說,粗略解釋一下

2022-08-16 13:00:13 字數 1618 閱讀 8412

關於為什麼會有偏移一說,粗略解釋一下...

# y* v' i0 v2 c: c4 c

現在的程式編寫都是物件導向的,就是用類來封裝物件的屬性和方法...

我們假設遊戲大致是由以下幾個類構成的:

: r1 o,

s$ ]: d0 _+ b) u

cgame     遊戲類

; z* f/ k: c*

h/ a

cactor       角色類

" b5 r% u  v9

b' j1 ^6 w' q& r6 ~' _

cmonster   怪物類

citem       物品類

% o( ^: g0

t$ t* q" i* l; y

......

下面是各個類的宣告:

8 w+ c$ s& ^( ]

class cactor

: i  g' f, x7

h3 h6 o

& z/ k+ p. q) t, |" [

class cmonster

; p/ l" z  h6

q3 s- p

......

2 l0 w' _* k# f0 r8

c. }

# b/ z$ \6 e2 t- b8 z, i$ q* z

class cgame

+ s2 j0 t& w4 `% j

+ a6 z$ x4 `5 n1 |9 c

......

9 r7 r% ]2 x; ~

- v- _& v! ]1 w' s4 n

也就是說角色資訊、怪物資訊、物品資訊這些類在遊戲類裡面是以

類指標形式

宣告的!

7 u; l4 r; s2 `9 e3 p7 r

2 j( o: e* b$ c* w

遊戲啟動以後,cgame類應該作為乙個全域性變數被建立並初始化,

而遊戲就會在cgame類中的初始化成員函式中呼叫動態記憶體建立函式 new 來

建立cactor、cmonster、citem等物件的例項,因為是動態建立的,

所以他們的首位址是變動的...但是新建立的cactor類的首位址就

儲存在cgame類中成員變數cactor類指標中,其餘類推...

理解了上面的,對於偏移就應該好理解了...

cgame類是全域性靜態變數,首位址固定!那麼cactor類的首位址就應該是cgame類首位址+偏移得到...這個偏移就取決於在cgame類中成員變數cactor* pactor是第幾個變數,也就是它前面的成員變數佔了多少個位元組就取多少的偏移...那麼依此類推,cactor類中角色紅藍資訊就是由cactor的首位址+偏移得到......

) @! s; r, t# x  o

還有一點值得注意,現在的主流cpu都是32位的,也就是4個位元組,那麼它的指令都是基於雙字的寬度來設計的,也就是說處理雙字寬度的資料最快...所以就算宣告的是int型別(2位元組),編譯器編譯後這個變數在記憶體中仍然占用4個位元組來儲存...

結構體也是這樣...

關於為什麼會有偏移一說,粗略解釋一下

關於為什麼會有偏移一說,粗略解釋一下.y v i0 v2 c c4 c 現在的程式編寫都是物件導向的,就是用類來封裝物件的屬性和方法.我們假設遊戲大致是由以下幾個類構成的 r1 o,s d0 b u cgame 遊戲類 z f k c h a cactor 角色類 b5 r u v9 b j1 6 ...

說一說我為什麼還留在資訊化這個行業

作為乙個純工科出身的妹子 大學學的是機械設計 誤打誤撞進入了這個行業。都說軟體行業好,可是erp屬於軟體行業裡的傳統行當。相比網際網路還是有一定差距的。中間經歷過各種迷茫,也曾經想要逃 冷靜下來想了想,其實每個行業都有這樣的問題 因為薪資低,因為不喜歡,因為有瓶頸等等而選擇轉行。但是一步一步走到今天...

說一說 年輕的資本到底是什麼

前段時間得了腎結石。其過程還是很驚悚,大家原諒我來到地球三十多年幾乎沒有生過病 感冒幾乎都不得 因此那天上午突然左腰部劇烈疼痛時,我一度以為即將進入小盒子。到了醫院,急診,一痛止痛針 b超 各項檢查一條龍服務完畢。那位長得好像奧特曼的急診醫生問我 要不要做個ct,要不做個吧?此時的我已然齜牙咧嘴,急...