Writing Efficient C++ Code
2 days ago
- C++ 在高级功能和低级硬件访问之间提供了独特的折中,使其成为游戏等性能关键型应用的理想选择。
- 面向对象编程由于分散的小对象和指针密集型数据结构,可能导致缓存未命中和并行化困难。
- 数据导向设计(DOD)首先关注内存中的数据布局,使用连续数组并最小化缓存未命中。
- 内存层次结构(寄存器、缓存、RAM、磁盘、互联网)显示,访问RAM比访问缓存慢数百个周期,强调了缓存友好模式的重要性。
- 良好实践包括使用数组(如std::vector)而非链表,对于热/冷数据分离优先使用结构体数组(SOA)而非数组结构体(AOS),以及重用对象以避免重复分配。
- 编译器优化可能受到指针别名的阻碍;使用局部副本或__restrict有助于解决,在循环外声明变量可以节省大量时间(例如,字符串重用可节省25%)。
- 禁用不必要的特性(异常、RTTI)并使用自定义分配器可以提高性能。STL高效,但需要注意其内部分配(例如,list/set与vector)。
- 优化应在整个开发过程中考虑,而不仅仅是在性能分析之后,以避免代价高昂的重新设计。