鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

避免对象/结构/联合等类型采用值传递的方式传递函数参数,并按需采用const修饰

【说明】 在程序执行阶段,尽可能根据实际使用的情况选择合适的参数传递方式,针对较大的对象、结构、联合体等类型参数,避免值传递的方式传参;实际编码过程中,可以考虑采用指针传递代替值传递(C++中可以采用引用传递的方式代替值传递),对于只读类型的参数传递,可以考虑采用const关键字修饰,借助编译阶段的类型检查机制,避免函数对入参的误修改。

【原理】 C/C++中有多种传递参数方案:值传递、指针传递、或传引用(C++)的方式。其中,值传递的方式,会将参数整体复制后作为实参传递到函数。对于较大的数据结构而言,值传递的方式,相对于指针传递等方式性能更差,由于其复制后的实参保存在程序的栈上,这种传参方式也更容易出现导致程序栈溢出等问题。

【注意事项】 从值传递修改为地址传递,需要额外增加对地址有效性防护,否则可能引入安全风险。

【案例】

优化前
struct InstStru {
    int id;
    int extId;
    ...
};

int Func(InstStru instInfo)
{
    ...
    InstTbl *baseTbl = GetInstTbl(instInfo.id);
    ExtInstTbl *extTbl = GetExtInstTbl(instInfo.extId);
    ...
};

说明: 上述函数Func的输入参数instInfo是结构类型,且按照传值的方式传递参数,这样的实现方式会导致在函数被调用时,参数被整体复制后传递,影响性能。

优化后
struct InstStru {
    int id;
    int extId;
    ...
};

int Func(const InstStru *instInfo)
{
    ...
    InstTbl *baseTbl = GetInstTbl(instInfo->id);
    ExtInstTbl *extTbl = GetExtInstTbl(instInfo->extId);
    ...
};

说明:优化后的函数按照传指针的方式进行参数传递,避免运行阶段函数调用时的参数复制,提高性能。同时,考虑到函数Func本身对参数的使用方式为只读,在传指针的基础上,增加对参数的const修饰。