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

时间:2012-05-09 23:47:29

标签: c static-variables static

为什么有些人这样做:

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

而不是:

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

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

5 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

static的版本,因此

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

  2. 其次,它只会初始化一次,而不是每次都与其他变量不同 功能,肯定会产生差异。

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