通过值或指针传递和返回结构-是否有默认准则?

时间:2019-04-24 23:37:16

标签: c memory struct conventions

所以我一直在寻找关于两个主题的经验法则指南:

  • 何时按值返回一个结构体,何时按指针返回它(在被调用函数创建该结构体的情况下)。例如:
MyThing make_my_thing() { MyThing m; /* ... */ ; return m; }
// Vs.
MyThing* make_my_thing() { MyThing* m = malloc(sizeof(MyThing)); /* ... */ ; return m; }
  • 何时按值传递结构与何时按指针传递结构
// Assume do_something() doesn't need to mutate m
void do_something(MyThing m) { /* ... */ }  
// Vs.
void do_something(MyThing* m) { /* ... */ }

我要寻找的经验法则不适合所有情况,但在结构不是很大的一般情况下,应该使用默认值。

请注意,我知道不同的情况可能需要不同的解决方案-但尽管如此,我仍在寻找大多数开发人员遵循的基本“默认”约定(如果存在)。

我已经在该网站上阅读了许多问题和答案,并提出了以下准则:

  • 默认值为按值返回结构。否则,我们将不得不malloc对其进行生命周期管理。
  • 默认为通过指针传递结构-无需担心生命​​周期管理,而且无需进行数据复制。

这些准则是否在C程序员中被广泛接受?如果没有,那么更普遍接受的约定是什么?

1 个答案:

答案 0 :(得分:1)

  

通过值或指针准则传递和返回结构

1)体积小。当struct较小时-我会说<=指针大小的两倍,从值上传递struct而不是指针指向{ struct。通过值传递对象的简单性。

2)大尺寸。当struct大时,肯定通过pointer to a结构会更有效。

3)数值对象。当struct具有固定大小的分配并表示 number 时,按值传递似乎更好。

4)隐藏。指向struct的不透明点是隐藏struct的内在特性和推广面向对象代码的好方法。

在其他情况下,我想讲清楚代码-通常意味着使用指向struct的指针,这是C语言惯用的。


对于一般用法,我发现重新调整了指向值很小的struct的指针-除了一个重要的情况:形成一组函数,其中 init 函数返回一个分配了指向struct的指针。