虽然这个主题已经多次讨论过,但到目前为止我还没有找到任何令人满意的答案。何时从函数返回数据 返回 或通过 参考 更改地址数据?经典的答案是在变量变大时将变量作为函数的引用传递(以避免堆栈复制)。这看起来像结构或数组。但是,从函数返回指针并不罕见。实际上有些函数从C库到确切的东西。例如:
char *strcat(char *dst, const char *src);
即使出现错误,也始终返回指向目标的指针。在这种情况下,我们可以只使用传递的变量并保留返回值(与大多数情况一样)。
在看结构时,我发现同样的事情正在发生。我经常在函数时返回指针 只要 需要在变量初始化中使用。
char *p = func(int i, const char *s);
然后有一个论点,堆栈应对变量是昂贵的,所以使用指针代替。但如上所述 这里 一些编译器能够自己决定(假设这也适用于C)。是否有一般规则,或者至少有一些不成文的惯例何时使用其中一个?我重视高于设计的性能。
首先确定哪种方法最有意义 合乎逻辑 不管您认为性能影响可能是什么水平。如果回来了 struct 按价值最清楚地传达了 意图 代码,然后这样做。
这不再是20世纪80年代了。从那时起,编译器变得更加智能,并且在优化代码方面做得非常好,特别是以清晰,直接的方式编写的代码。类似地,参数传递和值返回约定也变得相当复杂。简单的基于堆栈的模型并没有真正反映现代硬件的现实。
如果生成的应用程序不符合您的性能标准,则通过分析器运行它以找到瓶颈。如果事实证明返回那个 struct 按价值导致问题, 然后 你可以尝试通过引用函数传递。
除非您在高度受限的嵌入式环境中工作,否则您实际上不必计算每个字节和CPU周期。你不想浪费不必要的东西,但同样的道理,除非a)你有非常严格的性能要求,否则你不想在低层次上如何工作。b)你是 密切 熟悉特定平台的详细信息(这意味着您不仅要了解平台的内部和外部函数调用约定,还要了解编译器如何使用这些约定)。否则,你只是在猜测。让编译器为您努力工作。这就是它的用途。