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

标签 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 程序员中被广泛接受?如果不是,更普遍接受的约定是什么?

最佳答案

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/

相关文章:

c - 指向单引号字符串的字符指针数组打印字符串的最后 4 个字节

铛生成文件 "ar: no archive members specified"

c++ - 为什么这段代码打印 0

c - 将内存映射到另一个地址

c++ - 将指向结构的指针转换为数组指针是否有效

c - 当我试图在文件中创建漏洞时 lseek 出错

php - 从控制台调用时如何查看 PHP 响应?

c - 我怎样才能释放我在这段代码中分配的所有内容?为什么会出现段错误?

c++ - 使用二进制文件填充结构

c++ - 在列表中的结构中访问/分配值的问题 - C++