能否用结构体拆分函数与导数计算并避免重复调用计算函数?
解决方案:复用结构体计算结果避免重复耗时
当然可以,核心思路是只调用一次cof()生成包含函数值和导数的结构体,让func()和deriv()直接复用这个预计算好的结果,不用各自触发重复计算。同时还要修复原代码里的内存泄漏问题,比如deriv()里没必要提前malloc内存,最后要记得释放分配的空间。
关键修改点:
- 给
func()和deriv()添加参数,接收已经计算好的Struct实例 - 在
main()里只调用一次cof(),把结果保存后传给两个函数 - 清理不必要的内存分配,最后释放
dxda的内存
修改后的完整代码:
#include <stdio.h> #include <math.h> #include <stdlib.h> struct tparams { double y; double* dxda; }; typedef struct tparams Struct; Struct cof() { Struct s; double* dxda = (double*)malloc(12 * sizeof(*dxda)); double a = 50; double b = 78; s.y = pow((a * b) / 4, 2); *dxda = (a / 8) * pow(b, 2); s.dxda = dxda; return s; } // 接收预计算好的Struct实例,直接读取函数值 void func(Struct result) { printf("result1: %g \n", result.y); } // 接收预计算好的Struct实例,直接读取导数 void deriv(Struct result) { printf("result2: %g \n", *result.dxda); } int main() { // 只计算一次结构体结果 Struct calc_result = cof(); // 复用结果 func(calc_result); deriv(calc_result); // 释放malloc的内存,避免泄漏 free(calc_result.dxda); return 0; }
额外说明:
- 原代码中
deriv()里提前malloc的dxda完全没用,因为之后直接被result.dxda覆盖,会造成内存泄漏,修改后直接用传入的结构体里的指针即可 - 最后一定要调用
free()释放dxda的内存,这是C语言手动内存管理的必要步骤 - 如果后续需要多次计算不同参数的结果,可以把
a和b改成cof()的参数,这样更灵活
内容的提问来源于stack exchange,提问作者Amyle
相关产品推荐
相关产品推荐

