2012-05-09 52 views
10

为什么有些人做的事:而不是我可以通过静态变量获得最佳性能吗?

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

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

看起来像Linux的源代码的应用非常普遍。有性能差异?如果是,有人可以解释为什么?提前致谢。

+1

这段代码没有编译,数组指示符应该在变量名后面,而不是在它之前。 –

回答

9

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

变量是在栈上分配的,他们会被保留,并且每个函数被调用时删除,重要的是,他们将朝着堆大小限制是许多严重制约嵌入式和资源 - 计数受限制的平台。

但是,静态变量存储在任一.BSS.DATA段(非明确地初始化静态变量将去.BSS,静态初始化静态变量将去.DATA),从堆栈中。编译器也可以利用它来执行某些优化。

3

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

2

在一个方法中定义一个变量static只意味着该变量不是“释放”的,即它将在随后的调用中保持它的值。 这可能会导致性能改进取决于算法,但它本身并不是一个性能改进。

3

在典型的实现,该版本与static将只是把字符串某处内存在编译的时候,而没有static版本将会使函数(每次被称为时间)在栈上分配一些空间,写串入那个空间。

static版本,因此,

  • 很可能是更快
  • 可使用较少的内存
  • 将使用较少的堆栈空间(其在一些系统是一种稀缺资源)
  • 将会在缓存中发挥更好的效果(这对于小字符串来说不太可能是个大问题,但如果foo更大)。
+1

你的意思是前者,而不是后者。 –

+0

为什么是,所以我做到了。谢谢。我编辑我的答案是(1)更清楚,(2)正确。 –

+0

它为什么会节省内存?加载函数时是否还需要花费堆栈内存? – dragonxlwang

1

是它使差,如果u已经声明为静态变量:

  1. 首先,存储器将在任一BSS或数据段,而不是堆叠进行分配。其次,它将被初始化一次,而不是每次都不像其他变量 函数那样,这肯定会产生差异。

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

相关问题