C:何时按值返回或传递引用

Yor*_*Wid 11 c pointers reference return-value

虽然这个问题已经多次讨论过,但到目前为止我还没有找到任何令人满意的答案.当通过向从函数返回数据的返回或传递一个参考来改变地址的数据?经典的答案是在变量变大时将变量作为函数的引用传递(以避免堆栈复制).这看起来像结构或数组.但是,从函数返回指针并不罕见.实际上有些函数从C库到确切的东西.例如:

char *strcat(char *dst, const char *src);
Run Code Online (Sandbox Code Playgroud)

即使出现错误,也始终返回指向目标的指针.在这种情况下,我们可以使用传递的变量并保留返回值(与大多数情况一样).

在看结构时,我发现同样的事情正在发生.当函数需要在变量初始化中使用时,我经常返回指针.

char *p = func(int i, const char *s);
Run Code Online (Sandbox Code Playgroud)

然后有一个论点,堆栈应对变量是昂贵的,所以使用指针代替.但正如这里提到的,一些编译器能够自己决定(假设这也适用于C).是否有一般规则,或者至少有一些不成文的惯例何时使用其中一种?我重视高于设计的性能.

Joh*_*ode 13

首先,决定哪种方法在逻辑层面最有意义,而不管您认为性能影响可能是什么.如果返回a structby值最清楚地表达了代码的意图,那么就这样做.

这不再是20世纪80年代了.从那时起,编译器变得更加智能,并且在优化代码方面做得非常好,特别是以清晰,直接的方式编写的代码.类似地,参数传递和值返回约定也变得相当复杂.简单的基于堆栈的模型并没有真正反映现代硬件的现实.

如果生成的应用程序不符合您的性能标准,则通过分析器运行它以查找瓶颈.如果事实证明struct按值返回导致问题,那么您可以尝试通过引用传递给函数.

除非您在高度受限的嵌入式环境中工作,否则您实际上不必计算每个字节和CPU周期.你不想浪费不必要的东西,但同样的道理,除非a)你有非常严格的性能要求,并且你非常熟悉你的细节,否则你不想在低层次上如何工作.您的特定平台(意味着您不仅知道平台的内部和外部函数调用约定,还知道您的编译器如何使用这些约定).否则,你只是在猜测.让编译器为您努力工作.这就是它的用途.