IMO可以修改所有直接返回结构的代码,以返回指向结构的指针。
何时直接返回结构是一种好习惯?
答案 0 :(得分:7)
修改怎么样?返回指向函数内结构的静态实例的指针,从而使函数不可重入;或者通过返回一个指向堆分配结构的指针,调用者必须确保释放并且适当地这样做?在一般情况下,我会考虑将结构作为一种良好的做法。
答案 1 :(得分:4)
返回完整结构而不是指针的最大好处是你不必乱用指针。通过避免指针固有的风险,特别是如果您正在分配和释放自己的内存,编码和调试都可以大大简化。
在许多情况下,直接传递结构的优点超过了将整个结构复制到堆栈的缺点(时间/内存)。除非您知道必须进行优化,否则没有理由不采取更简单的方法。
答案 2 :(得分:2)
我认为以下情况是我最常选择通过结构的方法:
“功能编程”样式代码。传递了大量的东西并且有很多指针会使代码复杂化(如果你需要开始使用malloc + free,那就不算数了)
小结构,例如
struct Point{ int x, y; };
不值得通过引用传递内容的麻烦。
最后,我们不要忘记,按值传递和传递引用实际上是非常不同的,因此某些类的程序将更适合于一种风格,如果使用其他样式,最终会看起来很难看
答案 3 :(得分:1)
这些其他答案都很好,但我认为missno最接近于通过提及小结构“回答问题”。更具体地说,如果结构本身只有几个机器字长,则可以克服“空间”异议和“时间”异议。如果指针是一个单词,结构是两个单词,那么结构复制操作与指针复制相比要慢多少?在缓存的架构上,我怀疑答案是“无所有”。至于空间,堆栈上的2个字<堆上1个字+堆上2个字(+开销)。
但这些考虑因素仅适用于特定情况:本课程的这一部分内容。
对于编写C程序的级别,您应该使用更容易阅读的内容。
答案 4 :(得分:0)
如果你试图让你的函数副作用免费,直接返回一个结构会有所帮助,因为它实际上是值传递。它效率更高吗?不,通过引用传递更快。但是没有副作用可以真正简化线程的使用(这是一项非常艰巨的任务)。
答案 5 :(得分:0)
在某些情况下,按值反复返回结构:
1)一个库函数,它返回稍后在其他调用中重用的“令牌”数据,例如。文件或套接字流描述符。返回一个完整的结构会破坏库的封装。
2)包含可变长度数据缓冲区的结构,其中结构的大小已经调整,以适应数据的绝对最大大小,但平均数据大小要小得多,例如。一个网络缓冲区结构,在其末尾有一个'dataLen'int和'char data [65536]'。
3)任何typedef的大型结构,其中复制数据的成本变得很高,例如:
a)当必须通过多个函数调用返回结构时 - 多次复制相同的数据。
b)结构随后排队到其他线程 - 宽队列意味着在复制/复制期间锁定时间更长,因此争用的可能性增加。那,以及结构的大小都在生产者和消费者线程堆栈上造成。
c)结构通常在层之间移动,例如。协议栈。
4)改变def的结构。将存储在任何数组/列表/队列/堆栈/ whateverContainer中。
我怀疑我被c ++和其他OO语言所破坏,我倾向于malloc / new几乎任何无法存储在原生类型中的东西
RGDS, 马丁