C++中两次声明的局部变量与单个全局变量的性能对比
全局变量pi vs 局部变量pi的性能对比(C++场景)
先给结论:在现代编译器的优化下,用局部常量的性能不会比全局变量差,甚至大概率更好,具体原因拆开来聊:
局部常量的编译优化
如果你在函数里写const double pi = 3.14;,或者更优的constexpr double pi = 3.14;,编译器会直接把这个值内联到所有用到pi的地方——也就是说,代码里根本不会有“读取变量”的操作,直接用3.14这个字面量计算,完全没有内存读写开销。哪怕你在100个函数里都这么写,编译器也会帮你做相同的优化,不会有额外的内存占用或访问成本。全局变量的潜在开销
要是把pi声明成全局变量,哪怕是const的,编译器有时候会有所顾虑:比如这个全局变量会不会被其他编译单元的代码修改?如果没有明确标记成constexpr或者static const,编译器可能不敢直接内联它的值,每次用到都要从全局内存区域读取。虽然单次内存访问的开销微乎其微,但放大到100次甚至更多场景时,累计的缓存命中差异就会体现出来——全局存储区的缓存命中率通常比栈区低。
要是你声明的是非const的全局pi,那性能劣势会更明显:编译器无法确定这个值会不会被其他线程或函数篡改,必须每次都从内存读,完全没法做优化。实际开发的最优选择
别纠结全局还是局部,直接用constexpr double pi = 3.14;:- 放在函数里,不会污染全局命名空间,符合封装原则;
- 放在全局(加static)也没问题,但没必要;
- 不管放哪,编译器都会把它当成编译期常量处理,性能拉满。
内容的提问来源于stack exchange,提问作者dev77cmd
相关产品推荐
相关产品推荐

