有没有直接返回结构是好的做法?

IMO所有直接返回结构的代码都可以修改为返回指向结构的指针。

何时直接返回结构是一种好习惯?

修改怎么样? 返回指向函数内结构的静态实例的指针,从而使函数不可重入; 或者通过返回指向堆分配结构的指针,调用者必须确保释放并且适当地这样做? 我会考虑将结构作为一般情况下的良好实践。

返回完整结构而不是指针的最大好处是你不必乱用指针。 通过避免指针固有的风险,特别是如果您正在分配和释放自己的内存,编码和调试都可以大大简化。

在许多情况下,直接传递结构的优点超过了将整个结构复制到堆栈的缺点(时间/内存)。 除非您知道必须进行优化,否则没有理由不采取更简单的方法。

我认为以下情况是我最常选择直接传递结构的方法:

  • “函数式编程”样式代码。 传递了大量的东西并且有很多指针会使代码复杂化(如果你需要开始使用malloc + free,那就算不上了)

  • 小结构,例如

    struct Point{ int x, y; }; 

    不值得通过引用传递东西的麻烦。


最后,我们不要忘记,按值传递和按引用传递实际上是非常不同的,因此某些类的程序将更适合于一种样式,如果使用其他样式,最终会看起来很难看。

这些其他答案都很好,但我认为missno最接近于通过提及小结构“回答问题”。 更具体地说,如果结构本身只有几个机器字长,则可以克服“空间”异议和“时间”异议。 如果指针是一个单词,结构是两个单词,那么结构复制操作与指针复制相比要慢多少? 在缓存的架构上,我怀疑答案是“无所有”。 至于空间,堆栈上的2个字<堆栈上的1个字+堆上的2个字(+开销)。

但这些考虑因素仅适用于特定情况:本课程的THIS课程。

对于编写C程序的级别,您应该使用更容易阅读的程序。

如果你试图使你的函数副作用免费,直接返回一个结构将有所帮助,因为它实际上是值传递。 它效率更高吗? 不,通过引用传递更快。 但是没有副作用可以真正简化线程的使用(这是一个非常困难的任务)。

在某些情况下,按值指示返回结构:

1)一个库函数,它返回稍后在其他调用中重用的’令牌’数据,例如。 文件或套接字流描述符。 返回一个完整的结构会破坏库的封装。

2)包含可变长度的数据缓冲区的结构,其中结构已被resize以容纳数据的绝对最大大小,但是平均数据大小要小得多,例如。 一个网络缓冲区结构,在其末尾有一个’dataLen’int和’char data [65536]’。

3)任何typedef的大型结构,其中复制数据的成本变得很大,例如:

a)当必须通过几个函数调用返回结构时 – 多次复制相同的数据。

b)结构随后排队到其他线程 – 宽队列意味着在复制/复制期间锁定时间更长,因此争用的可能性增加。 那,以及结构的大小是在生产者和消费者线程堆栈上造成的。

c)结构通常在层之间移动,例如。 协议栈。

4)改变def的结构。 将存储在任何数组/列表/队列/堆栈/ whateverContainer中。

我怀疑我被c ++和其他OO语言所破坏,我倾向于malloc / new几乎任何无法以本机类型存储的东西

Rgds,马丁