【问题标题】:Passing and returning structs by value or by pointer - are there default guidelines?按值或指针传递和返回结构 - 是否有默认准则?
【发布时间】: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


【解决方案1】:

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

1) 体积小。当struct 很小时——我会说struct 的指针传递struct 时,在大小方面几乎不会丢失。获得了通过值传递对象的简单性。

2) 大尺寸。当struct 很大时,当然传递pointer to astruct 更有效。

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

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

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


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

【讨论】:

  • 感谢您的回答。因此,据我所知,当 structs 很小或表示某个标量数值时,我们应该按值传递它们。否则,按指针传递。这本质上是你的观点吗?
  • @AvivCohn 这是一个很好的一阶结论。然而,这并不是一个硬性规则,因为情况会不时推动另一种方法,或者可能采用其他方法。
猜你喜欢
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多