【发布时间】:2013-12-05 19:25:23
【问题描述】:
我正在考虑一个问题,但无法确定这两个选项中的“更好”。它归结为决定一个复杂的数据成员(即,不是原语)应该是一个指针还是一个值。 (注意,我已经看到很多关于数据成员的指针与引用的问题,但没有关于指针与值的问题)我正在权衡的最大的事情是
- 数据成员的生命周期(无论它是否在其所有者的整个生命周期中都存在)。
- 在它确实持续整个生命周期的情况下,减少内存碎片。
考虑以下代码:
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 的生命周期,而后者又总是玩家的生命周期。
如果不是这样,我更喜欢指针,这样NULL 可以指示对象不存在(这对于并非所有玩家都有的统计数据可能更好)。
但是,由于情况并非如此,我认为我宁愿将其存储为值,以便减少较大的内存分配,而不是许多小的内存分配。
我的想法是正确的,还是有什么我没有考虑的?
编辑 - 我选择的词(“指针与值”)很差。我的意思是其中一个答案澄清了:
你在这里指的是天气,最好有
mHealth静态或动态分配;
此外,在这种情况下,我知道健康的寿命就是玩家的寿命,所以我的问题基本上归结为记忆。静态分配数据成员以减少分配,而不是进行一次大分配(当 Player 更新时)是否更好的内存管理。
【问题讨论】:
-
根据项目的大小,您可能还需要考虑,如果您使用指针而不是值,则在声明使用它的类时,整个类不需要在范围内,即
PlayerStatisticManager在你的例子中。这可以减少编译依赖,这在大型项目中可能会缩短编译时间。出于这个原因,我更喜欢指针(准确地说是某种智能指针)。 -
如果一个类中的数据是可选的,因为同一类的 2 个成员属于明确的不同类别(例如棒球中的投手和击球手),您可能需要考虑使用继承.您将拥有一个非常基本的球员类,然后从它继承来制作投手和击球手类,例如
-
@user904963,如果我打算以这种方式使用继承,我会同意。我在考虑更多关于数据驱动差异的东西,例如 RPG 中的类(某些类的特殊能量统计或其他东西)。
标签: c++ pointers memory datamember