C中的static关键字可以用来提高性能吗?

问题描述:

有没有做这样的事情之间的性能差异:C中的static关键字可以用来提高性能吗?

void function() { 
char bufgfer[256]; 
// ... 
} 

void function() { 
static char bufgfer[256]; 
// ... 
} 

我知道这改变了功能的工作方式,但如何表现?第二个更快?

hanks

+0

理论上是的,因为缓冲区可能只会被分配一次,但第一个只是堆栈中的减法,如果这个函数被调用了很多次,那么这个减法只会被真正注意到。 – RedX 2012-04-05 12:00:42

+1

它可能有时,有时它可能会更慢,它取决于函数中的其他变量,访问是什么。 – MByD 2012-04-05 12:00:43

+1

@RedX - 这并不准确。在堆栈上的分配可能是对堆栈指针的简单改变,并且如果还有其他变量,则可以在相同的改变中完成。如果您在堆栈中有一些变量并且有一个静态变量,那么它们的位置差异可能会降低性能。 – MByD 2012-04-05 12:02:50

如果缓冲区结束于CPU附近的缓存中,第一个可能会更快。

如果您认为第一个缓慢,因为在运行时会以某种方式分配缓冲区,那么不,这不是原因。所有这些都由编译器在编译时处理。而且,使缓冲区静态可能会使其不在缓存中。 (但谁知道,还是在乎?)

在我看来,你正在考虑过早的优化。

+0

感谢这是我正在寻找的答案:我认为不必为每个函数调用在堆栈上创建缓冲区会更快,显然我错了 – lezebulon 2012-04-05 19:15:40

它可能有时是,有时可能会更慢,它取决于函数中的其他变量,以及访问是什么。

最重要的是在需要时使用它,而不是在优化方面,而是在功能方面。如果你不需要一个变量是静态的,那么它不应该是这样的,大多数情况下,不同平台上的影响是不相关的。

切勿根据性能选择对象的存储时间(静态与自动)。存储持续时间不是出于性能目的而存在,而是因为它们具有严重不同的语义;将缓冲区设置为静态会极大地破坏代码的大量潜在用途,最明显的是多线程用法。对象应该具有静态存储持续时间的唯一时间是存储需要在调用之间保持的长期全局状态,即使此时通常是设计错误(此状态应保存在调用方保持的上下文中)。如此一来,静态存储时间的性能不太可能会更好,并且在很多情况下(尤其是PIC共享库或PIE可执行文件)访问静态变量的速度会比访问静态变量慢,因为函数必须加载GOT寄存器(如果它尚未加载)并执行GOT间接寻址或GOT相关寻址。