何时值得在结构定义中使用指向struct的指针?

时间:2009-04-13 00:27:27

标签: c pointers struct memory-management

很抱歉,问题不明确;我发现用一句话很难解释。

假设我有一个struct,其成员是struct,例如以下内容:

struct A {
    struct B b;
};

让我们说我希望这个结构的实例始终是堆分配的。通过改变它可以获得什么? (即将指针保持为struct B

struct A {
    struct B *b;
};

在后一种情况下,我会有一些函数,例如make_Afree_A,它们将负责分配和取消分配b指向的内存; < / p>

我能想到的唯一一个例子是,当struct A的所有实例并非实际使用b时,第二种形式可能更可取。在这种情况下,可以通过仅为需要它的那些实例分配额外的内存来保存内存。

是否有其他情况下第二种形式提供了有用的东西?

3 个答案:

答案 0 :(得分:7)

如果每个A只有一个B,则使用指向B的指针。

除了您不需要额外的内存管理之外,分配B实际上更慢且效率更低。

即使您想将指向B的指针传递给其他代码,您仍然可以传递该地址。

答案 1 :(得分:5)

当B的实例可以由A的多个实例共享时,您将通过指向B来获得。它有助于避免在多个位置重复和维护B的版本。根据乔纳森的评论,这是以知道何时释放记忆和宣传B的方式为代价的。

答案 2 :(得分:3)

我认为你的最后一句话让你头疼。如果不是每个A都有一个B,那么您可以通过使用指针获得内存节省(对于没有A的{​​{1}}来说,这是空的。

除非所有未使用的B的累积大小是可用堆的相当大的比例,否则这不太可能真正有用。

但我会将您的陈述更改为“当B的所有实例都没有A的完整副本时出于以下原因”(这是您要求的另一种情况) ):

  

其中B是列表中的节点(也包含指向另一个B或null的指针),我会将其设为指针[尽管您仍然可以嵌入第一个节点如果所有B必须至少有一个A]。

另一种可能性是在B s B之间共享A,如果它们的性质允许的话(例如A是屏幕上的窗口B),尽管你在这种情况下,必须引用 - 计算B以便知道何时最终在free_A()次调用中释放它们(当然,还能够重用已存在的B make_A() 1}}在您的{{1}}来电中。