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

问题描述 投票:0回答:1

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

  • 何时按值返回结构,何时通过指针返回结构(在被调用函数创建结构的情况下)。例如:
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程序员广泛接受?如果没有,那么更普遍接受的惯例是什么?

c memory struct conventions
1个回答
2
投票

按值或指针指南传递和返回结构

1)体积小。当struct很小时 - 我会说<=指针大小的两倍 - 当通过struct而不是通过指向struct的指针时,没有什么可以丢失,大小明智。获得了通过值传递对象的简单性。

2)大尺寸。当struct很大时,肯定通过pointer to astruct更有效率。

3)数字对象。当struct具有固定大小的分配并表示一个数字时,通过值似乎更好。

4)隐藏。对struct的不透明点是隐藏struct内部并促进面向对象代码的好方法。

对于其他情况,我会说清晰的代码 - 这通常意味着使用指向struct的指针,因为它是C惯用语。


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

© www.soinside.com 2019 - 2024. All rights reserved.