所以我一直在寻找关于两个主题的经验法则指南:
- 何时按值返回结构,何时按指针返回结构(在被调用函数已创建结构的情况下)。例如:
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 程序员中被广泛接受?如果不是,更普遍接受的约定是什么?
最佳答案
Passing and returning structs by value or by pointer guidelines
1) 体积小。当 struct
很小时 - 我会说 <= 指针大小的两倍,在按值传递 struct
时,在大小方面几乎不会丢失而不是通过指向 struct
的指针。获得了按值传递对象的简单性。
2) 大尺寸。当 struct
很大时,当然将 pointer 传递给
struct 会更有效。
3) 数字对象。当 struct
具有固定大小的分配并表示一个数字时,按值传递似乎效果更好。
4) 隐藏。指向 struct
的不透明点是隐藏 struct
内部结构和提升面向对象代码的好方法。
对于其他情况,为了清楚起见,我会说代码 - 这通常意味着使用指向 struct
的指针,因为这是 C 惯用的。
对于一般用法,我发现重新调整一个指向struct
的指针没有什么值(value) - 除了一个重要的情况:形成一组函数,其中 init 函数(s ) 返回指向 struct
的分配指针。
关于c - 按值或按指针传递和返回结构 - 是否有默认指南?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839916/