【发布时间】:2019-04-24 23:37:15
【问题描述】:
所以我一直在寻找关于两个主题的经验法则:
- 何时按值返回结构,与何时按指针返回(在被调用函数创建结构的情况下)。例如:
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 程序员中被广泛接受?如果不是,那么更普遍接受的约定是什么?
【问题讨论】:
-
通过价值传递任何大小的
struct是一个很大的负担。 -
@WeatherVane 不同意。传递一个很小的
struct,甚至可能比指针还小,这不是自重。 -
@chux 当然。我的重点是“任何大小”,而不是“任何任何大小”。
标签: c memory struct conventions