原文地址: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个字节来存储...
结构体也是这样...