【问题标题】:Do I get improved performance by making variables static?我是否可以通过使变量静态来提高性能?
【发布时间】:2012-05-18 12:51:54
【问题描述】:

为什么有些人声明他们的变量是静态的,像这样:

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

代替:

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

这似乎在 Linux 源代码应用程序中很常见。有性能差异吗?如果是,有人可以解释为什么吗?提前致谢。

【问题讨论】:

  • 这段代码无法编译,数组指示符应该在变量名之后,而不是之前。

标签: c static-variables static


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在方法中定义静态变量仅意味着该变量没有“释放”,即它将在后续调用中保持其值。 取决于算法,它可能会导致性能提升,但它本身肯定不是性能提升。

      【讨论】:

        【解决方案4】:

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

        因此带有static的版本,

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

        【讨论】:

        • 为什么是的,所以我做到了。谢谢。我已将我的答案编辑为 (1) 更清晰和 (2) 正确。
        • 为什么会节省内存?加载函数时还需要消耗栈内存吗?
        • @dragonxlwang 以char foo[] = "bar"static char foo[] = "bar" 对比。当程序加载到内存中时,"bar" 是可执行映像的一部分。不同之处在于它的处理方式。 static 直接指向加载的可执行映像中的"bar"(这也解释了static 的副作用)。非static 必须:(1) 分配足够大的堆栈空间以存储"bar",以及(2) 在每个函数调用 时将"bar" 从加载的程序复制到该堆栈空间。每次调用都会为该函数中的 all 堆栈变量创建一个新副本。这也是深度递归可以快速耗尽堆栈的原因。
        【解决方案5】:

        是的,如果您已将变量声明为静态变量:

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

        2. 其次,它只会初始化一次,不像其他变量那样每次都初始化 功能,这肯定会产生差异。

        3. 第三,它保留了 b/w 函数调用的价值。因此,根据具体情况,您应该 用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-20
          • 2011-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多