我可以获得最佳性能制作静态变量吗?

为什么有些人这样做:

char baa(int x) { static char foo[] = " .. "; return foo[x ..]; } 

代替:

 char baa(int x) { char foo[] = " .. "; return foo[x ..]; } 

在linux源代码应用程序上看起来很常见。 有性能差异? 如果有,有人可以解释原因吗? 提前致谢。

本身不是性能,而是减少内存使用量。 有一个性能提升,但它(通常)不是你看到这样的代码的主要原因。

函数中的变量在堆栈上分配,每次调用函数时都会保留和删除它们,重要的是,它们将计入堆栈大小限制,这是许多嵌入式和资源受限平台的严重限制。

但是,静态变量存储在.BSS.DATA段中(非显式初始化的静态变量将转到.BSS ,静态初始化的静态变量将转到.DATA ),不在堆栈中。 编译器还可以利用它来执行某些优化。

是的,性能不同:与每次初始化的自动存储中的变量不同,静态变量只在初次执行该函数时初始化一次。 如果没有写入foo ,则没有其他差异。 如果写入,则静态变量的更改在调用之间存在,而自动变量的更改在下次通过函数时会丢失。

在典型的实现中,带有static的版本只会在编译时将字符串放在内存中,而没有static的版本会使函数(每次调用它)在堆栈上分配一些空间并将字符串写入该空间。

因此,带有static的版本,

  • 可能会更快
  • 可以使用更少的内存
  • 将使用更少的堆栈空间(在某些系统上是稀缺资源)
  • 缓存会更好(对于一个小字符串来说这可能不是什么大问题,但如果foo更大则可能会更大)。

在方法中定义变量static只意味着变量不是“释放”的,即它将在后续调用中保持其值。 它可能会导致性能提高,具体取决于算法,但当然不是性能提升。

是的,如果您已将变量声明为静态,则会有所不同:

  1. 首先,内存将分配在bss或数据段中而不是堆栈中。

  2. 其次,它将仅被初始化一次,而不是每次都与其他函数变量不同,这肯定会产生差异。

  3. 第三,它保留了它的值b / w函数调用。所以根据你应该使用它的情况。