如何在共享内存上创建C++对象

本文探讨了在游戏开发中如何利用共享内存存放数据以提高性能,并介绍了如何在程序更新时重新建立对象的虚函数指针vptr,确保程序稳定运行。通过实例分析了如何在C++中实现这一过程,包括基类、虚函数和操作符new的使用。
游戏中通常会使用共享内存来存放一些数据,这样当程序二进制更新(只涉及代码逻辑变更,不涉及数据结构变更),程序core,异常停止等情况发生时,存放在共享内存中的数据并不会丢失。通过这种方式可以大大减少游戏逻辑与数据库的交互,通常也会简化编程逻辑,因为数据从共享内存中就可以得到。
  比如玩家对象可以放入共享内存。玩家对象和游戏中怪物等有一些共同特点,比如移动,血量等等。在C++中,通常会抽象一个基类用于表示一些对象共有的特性,这个基类包含一些虚函数,每个子类各自实现这些虚函数以展示不同的表象,比如玩家的移动和怪物的移动就可能是不同的。
  当有了虚函数后,对象A的内存布局中包含一个虚表指针,如下:
   
  由于A包含了一个指针,如果该对象存放在共享内存上,当重新加载更新后的程序二进制时,程序段地址在虚拟空间中的位置会发生变化,映射的共享内存基址也可能发生变化,这时共享内存中存放的vptr地址就已经失效了。这时共享内存中A对象数据有效,但是vptr失效。因此当不清共享内存重启程序时,需要重建vptr。vptr的设定和重置是由class的构造函数,析构函数和赋值运算符完成的。(《深度探索C++对象模型》)
  通过在calss A中实现class A特定的new操作,也就是在class A中定义原型为void* operator new(size_t) 函数,该函数只需要返回获取到的对象在共享内存中的指针基地址,该对象的vptr将由编译器负责设置。通过这种方式,就可以重新恢复vptr。(该函数的详细使用参考《primer c++》)
  因此,当程序未清共享内存启动时,只需要获取到共享内存的基地址,然后根据每个对象的大小计算出共享内存上每个对象的基地址,通过调用类中实现的operator new函数,就可以恢复每个对象的vptr了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值