我最近一直在浏览一些C代码并注意到有些人编写函数来动态分配和初始化C结构,例如。
struct pool {
/* ... */
};
struct pool *pool_new(/* ... */)
{
struct pool *p = calloc(1, sizeof(*p));
/* initialise p ... */
return p;
}
我不确定这是否是一种好的做法,因为这种定义强制使用动态分配,并可能导致不必要的内存碎片。我知道这可能是定义不透明对象的方法,但我已经看到了这种代码用于" normal"结构也是如此。这种做法有什么好处?
答案 0 :(得分:2)
动态过度静态分配的一个原因是对象的可移植性。堆栈分配的对象只能通过指针向下传递,永远不会向上传递,而堆分配的指针可以随意传递。
堆栈通常也比堆小,所以如果结构占用了很多ram,那么堆分配它们会更好。
使用分配功能还可以确保正确填写某些字段,尤其重要的是,如果这些字段是从结构中的其他值计算的,并且您不希望在任何地方复制这些计算。 / p>