很抱歉,问题不明确;我发现用一句话很难解释。
假设我有一个struct
,其成员是struct
,例如以下内容:
struct A {
struct B b;
};
让我们说我希望这个结构的实例始终是堆分配的。通过改变它可以获得什么? (即将指针保持为struct B
)
struct A {
struct B *b;
};
在后一种情况下,我会有一些函数,例如make_A
和free_A
,它们将负责分配和取消分配b
指向的内存; < / p>
我能想到的唯一一个例子是,当struct A
的所有实例并非实际使用b
时,第二种形式可能更可取。在这种情况下,可以通过仅为需要它的那些实例分配额外的内存来保存内存。
是否有其他情况下第二种形式提供了有用的东西?
答案 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}}来电中。