为了多态性,指向向量的指针-C++

Pointer to vector for sake of polymorphism - C++

本文关键字:向量 指针 -C++ 多态性      更新时间:2023-10-16

我正在开发一款基于OpenGL的游戏,在寻找一种将实体信息传递给渲染和网络功能的稳健方法时,出现了这个问题。

类似这样的东西:

vector <DynamicEntity> DynamicEntities;
vector <StaticEntity> StaticEntities;
vector <Entity> *Entities;
Entities.push_back(&DynamicEntities);
Entities.push_back(&StaticEnt);
Graphics.draw(Entities);
Server.bufferData(Entities);

Graphics.draw和Server.bufferData所需的唯一信息由Entity包含,DynamicEntity和StaticEntity都继承自Entity。

我知道这会起作用:

vector <Entity*> Entities;
for(uint32_t iEntity=0;iEntity<iNumEntities;iEntity++)
{
    Entities.push_back(&DynamicEntities[iEntity])
}
//(ad nauseam for other entity types)

但这似乎效率极低,而且必须考虑到随着游戏的进行实体数量的变化。我对数据结构的基础知之甚少;所以这可能是一个愚蠢的问题,但我希望能有一些见解。

与绘制图形的成本相比,您显示的for循环中的复制操作可能太快,无法测量。通过在循环之前执行Entities.resize(...)并在循环中使用数组索引,可以使其更快。

您在问题的第一部分提出的解决方案将不起作用,因为vector<StaticEntity>的数据布局可能与vector<DynamicEntity>的布局不同。对象的数组不是多态的,vector<>管理的存储本质上是一个有一些动态管理的数组

事实上,由于矢量存储类似于数组,如果用数组索引替换push_backfor循环的主体将编译为类似于的内容

*p1++ = p2++;

编译器甚至可以自动向量化!