转自个人博客
1. 避免创建过多中间变量
过多的中间变量不利于代码的可读性,还会增加内存的使用,而且可能导致额外的计算开销。
将用于同一种情况的变量统一管理,可以使用一种通用的变量来代替多个变量。
2. 函数中习惯使用引用传参而不是返回值赋值
常有的一种情况是,需要使用函数进行计算或处理数据,并通过其返回值获得结果。
对于简单的计算或处理,直接使用返回值返回结果无可厚非,方便快捷也影响不了多少运行效率。
但对于复杂处理,或对大数据量的变量进行处理时,就要习惯使用引用传参进行赋值并获得处理结果。引用传参后函数能直接对原变量进行操作,能减少不必要的内存拷贝,提高运行效率。而且,可以使用返回值实现其他功能,比如用一个bool值返回操作是否成功。
#include <iostream> int calculation(const int &x, const int &y) { return x + y; // 简单运算
} bool complexCalculation(const int &x, const int &y, int &result) {// 复杂运算result = .....;return true;// 对于失败情况返回false
}int main() { int a = 5, b = 10, result; result = calculation(a, b); // 直接获取值if(complexCalculation(a, b, result)){ // 引用传参std::cout << "Calculation successful" << result;}return 0;
}
3. 习惯使用const修饰参数
始终记得对需要的变量或函数参数使用const关键字修饰是一个很好的习惯,比如上面的bool complexCalculation(const int &x, const int &y, int &result);
。
使用const变量能避免无意中修改变量或参数值,尤其是后期维护或升级代码时,有时候就会忘记以前写的代码的特定使用场景而为了图方便直接修改。在需要的地方使用const修饰也有利于提高代码可读性和安全性。
4. 全局变量在使用的时候再分配内存
一般来说,全局变量会在程序启动时分配内存,对于指针,一些人习惯性会在构造函数中分配需要的内存,而很多时候,这是不必要的,应该谨慎考虑变量的使用情况,在实际第一次需要的时候再分配内存。这样能避免不必要的内存占用,也能避免一些内存泄露的情况。
class myClass {
public:explicit myClass(){m_myArray = nullptr;}~myClass(){delete[] m_myArray; };void myFunc(){m_myArray = new int[5]; // 在此处第一次需要时再分配内存for (int i = 0; i < 5; ++i) { globalArray[i] = i * 10; std::cout << globalArray[i] << std::endl; } // 释放内存也要再不需要的时候进行释放}protected:int *m_myArray;
};
5. 减少函数调用的次数
程序中跳转执行的代价很高,不利于运行效率,而很多人忽视了一点是,常用的函数也是一种跳转执行的情况。
每一次函数调用都带来一定的开销,在频繁调用的情况下,合理管理这个开销就显得格外重要。
一般我们都习惯使用函数能提高代码的可读性,但有些时候这样就会降低代码的运行效率,有句话叫“效率高的代码可读性都不高”,虽然我们不必做到极致的高效率,但也要谨慎权衡效率和可读性。
而要避免使用不必要的函数可以考虑通过内联函数或者将常用常量作为全局变量来减少函数调用。
#include <iostream> inline int square(int x) { // 内联函数 return x * x;
} int main() { for (int i = 0; i < 5; ++i) { // 减少函数调用的次数 std::cout << "Square of " << i << " is " << square(i) << std::endl; } return 0;
}