合理声明局部变量可提升时间与空间局部性:就近声明、连续布局高频变量、缩短生命周期,并注意伪共享风险,从而优化缓存命中率。
把局部变量声明在合适的位置,能直接改善时间局部性和空间局部性,从而提升缓存命中率。关键不在于“要不要用局部变量”,而在于“什么时候声明、在哪里使用、和哪些数据一起访问”。
把循环中重复读写的变量提出来
循环体内频繁访问的字段或计算结果,如果每次都从对象或数组里重新取,就容易触发多次内存加载,破坏时间局部性。声明为局部变量后,编译器大概率将其分配到寄存器或L1缓存,访问极快。
- 避免每次迭代都访问
obj.field或arr[i].value - 改成先赋值:
int val = arr[i].value;,后续全部用val - 尤其适用于 getter 方法调用、带偏移的指针解引用、结构体成员链式访问等场景
让相关数据在栈上连续布局
局部变量在函数栈帧中是按声明顺序依次分配的。若多个高频协作的变量(如坐标 x/y、状态 flag/count、索引 i/j)相邻声明,它们更可能落在同一缓存行内,一次加载就能覆盖多个访问点,强化空间局部性。
- 推荐写法:
int x, y; float scale; bool valid; - 避免拆开:
int x; ... long unused_var; ... int y;(中间插入大变量或未使用变量会打断连续性) - 结构体成员排序逻辑也适用此原则:把同阶段使用的字段放在一起
控制作用域,缩短变量生命周期
局部变量的作用域越小,越容易被编译器优化进寄存器;生命周期越短,越不容易挤占缓存资源或干扰其他热数据驻留。过早声明、过晚销毁,反而增加缓存压力。
- 不要在函数开头堆满所有变量,而是靠近首次使用处声明
- 嵌套作用域合理使用:
{ int temp = calc(); use(temp); },结束后立即释放栈空间 - 避免一个 long long 类型变量长期占据64字节缓存行,却只在末尾用一次
避免跨缓存行的“伪共享”风险
多线程环境下,若两个线程分别修改不同局部变量,但它们恰好落在同一缓存行(64字节),就会因 MESI 协议导致频繁失效。虽然局部变量通常在线程栈上天然隔离,但在某些共享栈或特殊 ABI 下仍需留意。
- 对齐敏感变量可显式填充,如用
alignas(64)分隔关键标志位 - 高并发函数中,避免将多个原子计数器、标志位紧挨着声明
- 调试时可用 perf 工具观察
L1-dcache-loads-misses和cache-references比值判断是否异常

















