我正在考虑一个问题,无法得出两个选项中"更好"的结论。这归结为决定一个复杂的数据成员(即不是基元)应该是一个指针还是仅仅是一个值。(注意,我看到了许多关于数据成员的指针与引用的问题,但没有关于指针与值的问题)我正在权衡的最大问题是
- 数据成员的寿命(无论它是否在其所有者的整个寿命内)
- 在确实持续整个寿命的情况下,可以减少内存碎片
考虑以下代码:
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
是否更好;这是一个设计问题,取决于应用程序。两种方法都很好,但没有更好的最终解决方案,这取决于。。。。