gpt4 book ai didi

c++ - 当您希望界面拥有所有内存时,PIMPL Idiom 的替代方案

转载 作者:太空狗 更新时间:2023-10-29 20:38:14 27 4
gpt4 key购买 nike

PIMPL 习语的目的是隐藏实现,包括方法、结构,甚至结构的大小。一个缺点是它使用堆。

但是,如果我不想隐藏任何东西的尺寸要求怎么办。我只是想隐藏方法、结构的格式和变量名。一种方法是分配一个完美大小的字节数组,让实现不断地将其转换为任何结构并使用它。但是手动找到要为对象分配的字节大小?一直都在做类型转换吗?显然不实用。

是否有处理这种情况的习惯用法或一般方法有利于 PIMPL 或不透明指针。

最佳答案

一种完全不同的方法可能是重新思考您的对象真正代表的性质。在传统的 OOP 中,通常将所有对象视为具有自己的数据和方法的独立实体。其中一些方法对类来说是私有(private)的,因为它们只是该类自己的内务管理所必需的,因此这些是您通常移动 Pimpl 类的“impl”的东西。

在最近的一个项目中,我一直偏爱 Domain-Driven Design方法之一是将数据与处理数据的逻辑分开。然后,数据类变得只不过是结构,以前隐藏在 Pimpl 中的复杂逻辑现在可以放在没有自己状态的服务对象中。

考虑一个(相当人为的)游戏循环示例:

class EnemySoldier : public GameObject
{
public:
// just implement the basic GameObject interface
void updateState();
void draw(Surface&);

private:
std::unique_ptr<EnemySoldierImp> m_Pimpl;
};
class EnemySolderImpl
{
public:
// 100 methods of complex AI logic
// that you don't want exposed to clients

private:
StateData m_StateData;
};
void runGame()
{
for (auto gameObject : allGameObjects) {
gameObject->updateState();
}
}

这可以重组,这样我们就可以将这两件事分开,而不是 GameObjects 管理它们的数据它们的程序逻辑:

class EnemySoldierData
{
public:
// some getters may be allowed, all other data only
// modifiable by the Service class. No program logic in this class
private:
friend class EnemySoldierAIService;
StateData m_StateData;
};
class EnemySoldierAIService
{
public:
EnemySoldierAIService() {}

void updateState(Game& game) {
for (auto& enemySoldierData : game.getAllEnemySoldierData()) {
updateStateForSoldier(game, enemySoldierData);
}
}

// 100 methods of AI logic are now here

// no state variables
};

我们现在不需要任何 Pimpls 或任何内存分配的 hacky 技巧。我们还可以使用游戏编程技术来获得更好的缓存性能和减少内存碎片,方法是将全局状态存储在几个平面 vector 中,而不是需要一个指向基类的指针数组,例如:

class Game
{
public:
std::vector<EnemySoldierData> m_SoldierData;
std::vector<MissileData> m_MissileData;
...
}

我发现这种通用的方法确实简化了很多程序代码:

  • 不再需要粉刺
  • 程序逻辑都在一个地方
  • 通过在运行时在 Service 类的 V1 和 V2 版本之间进行选择,可以更轻松地保持向后兼容性或放弃替代实现
  • 更少的堆分配

关于c++ - 当您希望界面拥有所有内存时,PIMPL Idiom 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32300670/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com