【问题标题】:C++ frequently changing list of structs - keep only pointers or entire structs?C++ 频繁更改结构列表 - 只保留指针或整个结构?
【发布时间】:2018-11-07 23:14:30
【问题描述】:

我为游戏中的每个实体都有一个类,它有一个子类用于管理该实体的某些属性。 属性管理类拥有一个 std::list 结构,每个结构都有关于单个属性的数据和一些简单的函数来操作该数据。 这里有一些伪代码来说明它:

struct stAttribute
{
    /* data & functions */
}

class AttributeManager
{
    std::list<struct stAttribute> attributeList;
    /* ... */
};

class Entity
{
    AttributeManager attribMgr;
    /* .... */
};

int main(void)
{
    Entity ent;

    struct stAttribute newAttrib;
    /* ... */
    ent.attribMgr.attributeList.push_back(x);

    return EXIT_SUCCESS;
}

实体在游戏运行时经常被创建和删除,属性也是如此。

我开始怀疑“静态”创建它们并将整个结构保留在列表中是否是一个不错的选择。我主要关心的是性能。 动态分配内存并仅存储指向结构的指针会更好吗?释放内存没有任何问题,因为属性的删除是由 AttributeManager 类处理的。

【问题讨论】:

  • 从 cppcon 2018 看看这个; youtube.com/watch?v=yy8jQgmhbAU 详细了解程序结构的影响,OOP v Data Oriented Design。有见地的谈话。
  • 你不想要std::list。我能想到使用std::list 的唯一“好”原因是如果您想要指向列表元素的稳定指针,这不是一个好理由,这是一个坏理由。使用矢量。
  • 写两个,然后配置文件。也就是说,保罗的回答是正确的。在多态性之外的std::list 中很少需要指针,因为列表具有非常宽容的迭代器失效。 list 的缓存和分支预测友好性也很差,因此您可能需要将std::vector 混入其中,以查看其 O(1) 访问和缓存友好性,同时迭代优势超过 O(N) 劣势删除一个元素。

标签: c++ memory struct


【解决方案1】:

我的 0.02 美元:让您的列表“拥有”您的 stAttribute 对象对我来说似乎完全合适 - 这就是事情通常的完成方式,而且它们经常来来去去的事实不会改变我对此的看法。

但是,请务必研究 std::list 提供的 emplace_xxx 函数(消除了 push_back 等隐含的复制操作)并确保 std::list 是您的用例之前的最佳容器你承诺它。

【讨论】:

  • list的专长是无论是否拥有内容都来得快去得快。由于增加了额外级别的指针追逐和额外的(假设这里)动态内存管理,您可能会使用指针变慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2021-05-03
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多