条款20:宁以pass-by-reference-to-const替换pass-by-value

本文探讨了值传递带来的问题,如多次构造析构的成本及对象切割问题,并指出对于内置类型、STL迭代器和函数对象等,值传递通常更为合适。

pass-by-value的问题:

1、多次的构造析构,成本高。

2、造成对象切割问题

 

但内置类型、STL的迭代器、函数对象(?),pass-by-value方式往往比较适合。

这个问题是 **SonarQube** 静态代码分析工具检测出的 **性能或编码规范问题**,提示如下: > ❗ **Function parameter 'aiSearchVehicleInfo' should be passed by const reference. [CWE-398]** ### 🔍 问题含义: 你传入的函数参数 `aiSearchVehicleInfo` 是一个类对象(比如 `AISearchVehicleInfo`),当前是**按值传递(pass by value)**,这样会导致函数调用时进行**对象拷贝**,可能带来不必要的性能开销。 SonarQube 建议你将这个参数改为 **const 引用传递(pass by const reference)**,这样可以避免拷贝,提高性能。 --- ### ✅ 示例问题代码: ```cpp void ProcessVehicleInfo(AISearchVehicleInfo aiSearchVehicleInfo) { // 使用 aiSearchVehicleInfo } ``` --- ### ✅ 解决方案: 将函数参数改为 `const AISearchVehicleInfo&`: ```cpp void ProcessVehicleInfo(const AISearchVehicleInfo& aiSearchVehicleInfo) { // 使用 aiSearchVehicleInfo } ``` 这样就不会拷贝对象,而是通过引用访问原始对象,同时 `const` 保证函数不会修改原始对象。 --- ### 📌 如果是类成员函数: ```cpp void MyClass::UpdateVehicleInfo(AISearchVehicleInfo aiSearchVehicleInfo); ``` 同样改为: ```cpp void MyClass::UpdateVehicleInfo(const AISearchVehicleInfo& aiSearchVehicleInfo); ``` --- ### 🧠 为什么这样做? - **避免拷贝构造**:如果对象较大(包含多个成员变量),按值传递会调用拷贝构造函数,浪费时间和内存。 - **const 保证安全**:使用 `const` 可以防止函数内部修改原始对象,增强代码可读性和安全性。 - **提升性能**:适用于所有自定义类型(如结构体、类等)。 --- ### ✅ 注意事项: - 如果函数内部需要修改参数内容,则不能使用 `const`。 - 对于内置类型(如 `int`, `double`)或小型结构体,按值传递可能更高效。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值