应减少循环内指针解引用、用指针算术替代多维数组索引、避免虚函数调用开销、优化结构体内存布局,并通过汇编分析真实瓶颈。

减少循环内指针解引用次数
每次 *ptr 都是一次内存读取,编译器未必能自动优化掉重复解引用。尤其在紧循环中,反复通过同一指针访问成员或数组元素,会放大开销。
- 错误写法:
for (int i = 0; i —— 每次都做地址计算加解引用 - 推荐写法:
int* p = arr; for (int i = 0; i —— 解引用和自增分离,更贴近硬件指令流水线 - 若需多次访问同一对象成员(如
ptr->x,ptr->y,ptr->z),优先拷贝到局部变量:auto& obj = *ptr;再用obj.x等,避免三次指针偏移+解引用
用指针算术替代多维数组索引
二维数组 matrix[i][j] 在内存中是行优先连续布局,但 [i][j] 语法会隐含两次乘法和加法;而用指针算术可直接展开为一次线性偏移,且更容易被向量化。
- 低效:
for (int i = 0; i - 高效:
int* p = &matrix[0][0]; for (int k = 0; k - 注意:仅当确定是
int matrix[ROWS][COLS]这类静态/栈分配数组时才安全;new int*[rows]构建的“假二维”不适用
避免虚函数调用链中的指针间接跳转
通过基类指针调用虚函数(如 base_ptr->func())会触发 vptr → vtable → 函数地址 三级间接寻址,比普通函数调用多 2–3 个周期。高频路径上这是实打实的热区瓶颈。
- 若类型在编译期可知(如循环体内始终是
Derived*),显式转型:static_cast<derived>(base_ptr)->func()</derived>可绕过虚表 - 对小函数、热路径,考虑用模板替代虚函数(CRTP 或策略模式),把动态绑定转为静态分派
- 不要为了“看起来面向对象”而在每层都加虚函数;
final关键字可阻止继承,让编译器有机会 devirtualize
结构体指针访问要对齐内存布局
结构体成员顺序直接影响缓存行利用率。如果 ptr->a 和 ptr->b 被频繁一起访问,但因字段排列导致它们跨两个缓存行(64 字节),每次都要加载两行——性能直接腰斩。
- 按大小降序排列成员:
double、int64_t、int、char,减少填充字节,提升单缓存行容纳字段数 - 用
alignas(64)强制对齐结构体起始地址,配合 SIMD 批量处理时特别有用 -
sizeof(YourStruct)不等于各成员 size 之和——用offsetof()检查真实偏移,确认热点字段是否聚集
真正卡住性能的往往不是指针本身,而是指针背后那几纳秒的地址计算、那一次未命中的缓存行、那个没被内联的虚函数跳转。优化时别只盯着 * 和 -> 符号,得看生成的汇编里有没有多余 lea、有没有 cache miss 报警、vtable 查找是不是出现在 perf top 的前三名。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











