关于为什么会有偏移一说,粗略解释一下...

原文地址:http://www.bpsend.com/forum.php?mod=viewthread&tid=319&extra=page%3D1


关于为什么会有偏移一说,粗略解释一下...# 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
{
  ......
  int   红;
  int   蓝;3 d/ s8 L, g4 Z& o
  long 经验;
  ......
}
& Z/ K+ P. Q) t, |" [
class CMonster; P/ l" z  H6 q3 s- p
{
  ......
  int   红;- y: c* i, b+ H* f+ K. |; ?3 y9 _
  float X坐标;
  float Y坐标;; y! C; H5 z4 P. s5 @
  ......6 d( K5 x/ {3 |+ S) g( v! c+ k6 K& D
}

......2 L0 w' _* K# F0 r8 C. }
# b/ Z$ \6 e2 T- B8 Z, I$ q* Z
class CGame
{1 u1 t# ~4 z- e7 F" U8 M5 ~
  ......
  CActor* pActor;
  CMonster* pMonster;
  CItem* pItem;4 W( _0 C1 ~, _- Y) \; o- j) Y0 d
  .......
}+ 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个字节来存储...

结构体也是这样...


posted @ 2012-07-29 11:01  氺〤魚Oo。  阅读(360)  评论(0编辑  收藏  举报