• 传递引用或者指针
  • 使用 std::move 进行移动语义, 通过所有权的转移, 减少拷贝
  • 使用 std::forward 进行完美转发

编译期优化

  • 内联函数 inline
  • 模板和编译期常量计算
    • 使用模板元编程或 constexpr 将某些操作推迟到编译期,避免运行时计算。
      1
      2
      3
      constexpr int factorial(int n) {
      return n == 0 ? 1 : n * factorial(n - 1);
      }
  • 避免不必要的动态分配
    • 尽量使用自动存储(栈)而非动态分配(堆),因为堆分配的开销更大。
    • 使用标准容器(如 std::vector)时,可以通过 reserve 提前分配足够的内存。
      1
      2
      std::vector<int> vec;
      vec.reserve(100); // 提前分配 100 个元素的内存
  • 避免虚函数的性能开销
    • 如果类不需要继承和多态,尽量避免使用虚函数。
    • 使用 final 关键字声明不可被继承的类,帮助编译器进行优化。
  • 使用轻量级数据结构
    • 选择合适的数据结构,如 std::array 代替 std::vector 用于固定大小的数组。
    • 如果键值较少且固定,std::unordered_map 比 std::map 快。

运行期优化

  • 使用移动语义
    • 在可能的情况下,使用移动构造函数和移动赋值运算符避免拷贝开销。
    • 配合 std::move 显式触发移动语义。
      1
      2
      std::string str1 = "hello";
      std::string str2 = std::move(str1); // 移动而不是拷贝
  • 智能指针管理资源
    • 使用 std::unique_ptr 和 std::shared_ptr 代替裸指针,可以提高资源管理效率,避免内存泄漏。
    • 如果对象的生命周期明确,std::unique_ptr 的开销比 std::shared_ptr 更小。
  • 减少不必要的拷贝
    • 函数参数传递时,优先选择按引用传递而非按值传递。
  • 缓存优化
    • 数据访问尽量具有局部性(时间局部性和空间局部性),减少缓存未命中。
    • 避免频繁分配和释放小块内存。
  • 并行化和多线程
    • 使用 C++ 标准库中的多线程工具(如 std::thread、std::async)提高并行执行效率。
    • 结合线程池(如 std::thread_pool 或自定义线程池)处理高并发任务。
  • 避免不必要的同步
    • 在多线程场景中,避免对低冲突或读多写少的资源使用过多锁。
    • 使用无锁数据结构(如 std::atomic)或读写锁提高效率。

总结

  • 代码设计:选择合适的数据结构和算法是效率优化的基础。
  • 语言特性:利用 C++ 的现代特性(如移动语义、智能指针、constexpr)。
  • 资源管理:减少不必要的分配与拷贝,合理使用线程和同步。
  • 工具分析:结合性能分析工具,找到关键性能瓶颈,优化热点代码。