静态,常量和全局变量的性能提升

We'*_*ere 2 c++

是否有可能通过声明一个变量在C获得性能++ static,const或使其global

小智 6

性能取决于很多因素,你不能假设只是改变这些细节会真正提高性能.

提高性能的最佳方法是了解实现的详细信息,并应用分析工具来确定您的真正瓶颈.

大多数情况下,人们倾向于尽早优化代码,花费大量精力并使代码在对应用程序的整体性能没有太大影响的部分上不可读.

干杯


Die*_*ühl 6

将其放置在其他位置的情况下,您不太可能胜过内置类型的函数局部变量,除非:如果可以在编译时计算该变量的值,则使其constexpr成为理想选择。

  • static确定该对象是否已初始化的函数的每次调用中,使用该变量可能会产生少量开销,尤其是对于C ++ 11而言,该初始化是线程安全的。即使不需要检查,堆栈也可能位于高速缓存的内存中,而static变量则不需要。
  • 将变量设置为全局变量将增加其不在缓存内存中的机会,即很有可能使其变慢(除了不利的其他潜力,例如使其成为引入数据竞争的良好候选者)。
  • const如果编译器可以将值作为编译时间进行计算,则创建变量可能会有所帮助。

如果变量具有非平凡类型,则事情会变得更加有趣,因为例如a的初始化成本std::vector<T>是非平凡的。static与全局对象相比,我不希望使对象在局部功能上有所区别(即,我不会将它们全局化;总之没有空间容纳全局对象)。但是,制作对象static可能会在线程之间共享对象。如果这是一个问题,那么增加的锁定和序列化可能会抵消任何潜在的节省,并且使用基于堆栈的内存使用分配器是一种降低成本的更好方法(假设它们足够小,可以合理地在堆栈上使用)。

  • 某些东西是否在缓存中与它在 C++ 级别的声明方式无关,只与以前使用它的地址的方式(多久、多久、...)有关。堆栈实际上总是在缓存中,因为它实际上总是被使用,是的,但是一个广泛使用的全局变量也将在缓存中。 (2认同)