更适合动态或静态分配复杂的数据成员



我正在考虑一个问题,无法得出两个选项中"更好"的结论。这归结为决定一个复杂的数据成员(即不是基元)应该是一个指针还是仅仅是一个值。(注意,我看到了许多关于数据成员的指针与引用的问题,但没有关于指针与值的问题)我正在权衡的最大问题是

  1. 数据成员的寿命(无论它是否在其所有者的整个寿命内)
  2. 确实持续整个寿命的情况下,可以减少内存碎片

考虑以下代码:

class PlayerStatistic
{
    int m_MaxValue;
    int m_CurrentValue;
    // And many other things that round out a player statistic
}
class PlayerStatisticManager
{
    //While in this case, it may be better to store stats as a list of some kind and
    //identify them by a StatId or something, for this example, I'm declaring them 
    //individually.
    PlayerStatistic* m_pHealth;
    //OR
    PlayerStatistic m_Health;
    // And many more statistics.
}

在上面的例子中,每个玩家都有健康。他们的健康统计数据始终是StatisticManager的寿命,而StatisticManager又始终是玩家的寿命。

如果不是这样的话,我更喜欢指针,这样NULL就可以指示对象不存在(对于并非所有玩家都有的统计数据来说,这可能更好)。

然而,因为事实并非如此,我认为我宁愿将其存储为值,以减少较大的内存分配,而不是许多较小的内存分配。

我的想法是正确的,还是有什么我没有考虑的?

编辑-我的措辞("指针与值")很糟糕。我的意思是其中一个答案澄清了什么:

你在这里指的是天气,最好有静态或动态分配的CCD_ 2;

此外,在这种情况下,我知道健康的寿命就是玩家的寿命,所以我的问题基本上可以归结为记忆。为了减少分配,静态分配数据成员,而不是进行一次大的分配(当Player新加入时),这是更好的内存管理吗。

需要考虑的一件事是如何使用数据。无论您需要通过各种例程进行更改,还是在大多数流程中进行简单的监控。

如果您确实需要更改它并将更改公开给其他例程,那么最好通过引用传递它,在这种情况下,指针将是更好的解决方案。

另一方面,如果它是一个需要监控的简单值,并且不经常更改,我建议传递值,尤其是监控不会频繁发生。

就你的情况而言,以下是我的分析:1.在像战斗这样的事件中,玩家的健康状况可能会频繁变化。在这种情况下,数据最好通过引用传递。2.在非战斗状态下,玩家的健康状况很少受到一些进程的监控,比如当用户查询健康值时。在这种情况下,数据最好按值传递,因此值的意外更改不会影响对象实例本身。

就我个人而言,我会在PlayerStaticManager中使用指针。这提供了在不同场景中传递值或引用的选项。如果需要通过引用传递,请传递指针。如果您需要按值传递,请制作内容的副本,将其传递出去,然后忘记副本。

希望这能有所帮助。

只有当成员的生存期与包含对象的生存期不同时,才使用指针。

我想你有点搞砸了:"by reference"或"by value"指的是如何将参数传递给函数。按指针或按值是优选的,因为在这种情况下,只传递指向内存位置的指针;例如,对于结构,所有成员都被复制到堆栈中,从而增加了开销。

您在这里指的是静态或动态分配mHealth是否更好;这是一个设计问题,取决于应用程序。两种方法都很好,但没有更好的最终解决方案,这取决于。。。。

最新更新