070-cpp提升效率的操作
- 传递引用或者指针
- 使用 std::move 进行移动语义, 通过所有权的转移, 减少拷贝
- 使用 std::forward 进行完美转发
编译期优化
- 内联函数 inline
- 模板和编译期常量计算
- 使用模板元编程或 constexpr 将某些操作推迟到编译期,避免运行时计算。
1
2
3constexpr int factorial(int n) {
return n == 0 ? 1 : n * factorial(n - 1);
}
- 使用模板元编程或 constexpr 将某些操作推迟到编译期,避免运行时计算。
- 避免不必要的动态分配
- 尽量使用自动存储(栈)而非动态分配(堆),因为堆分配的开销更大。
- 使用标准容器(如 std::vector)时,可以通过 reserve 提前分配足够的内存。
1
2std::vector<int> vec;
vec.reserve(100); // 提前分配 100 个元素的内存
- 避免虚函数的性能开销
- 如果类不需要继承和多态,尽量避免使用虚函数。
- 使用 final 关键字声明不可被继承的类,帮助编译器进行优化。
- 使用轻量级数据结构
- 选择合适的数据结构,如 std::array 代替 std::vector 用于固定大小的数组。
- 如果键值较少且固定,std::unordered_map 比 std::map 快。
运行期优化
- 使用移动语义
- 在可能的情况下,使用移动构造函数和移动赋值运算符避免拷贝开销。
- 配合 std::move 显式触发移动语义。
1
2std::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)。
- 资源管理:减少不必要的分配与拷贝,合理使用线程和同步。
- 工具分析:结合性能分析工具,找到关键性能瓶颈,优化热点代码。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Hymns!