在执行以下操作之间存在性能差异:
void function() {
char bufgfer[256];
// ...
}
和
void function() {
static char bufgfer[256];
// ...
}
我知道它改变了该功能的工作方式,但性能如何?第二个更快吗?
绞纱
答案 0 :(得分:2)
如果缓冲区最终位于CPU附近的缓存中,第一个可能会更快。
如果您认为第一个较慢,因为缓冲区会以某种方式在运行时分配,那么,不,这不是原因。所有这些都由编译器在编译时处理。此外,使缓冲区静态可能会使其远离缓存。 (但谁知道,或关心?)
在我看来,你正在考虑过早的优化。
答案 1 :(得分:2)
有时可能会,有时它可能会变慢,这取决于函数中的其他变量,以及访问权限是什么。
最重要的是在需要时使用它,而不是在优化方面,而是在功能方面。如果你不需要一个变量是静态的,它不应该是,大多数时候对不同平台的影响是无关紧要的。
答案 2 :(得分:2)
永远不要根据性能选择对象的存储持续时间(静态与自动)。存储持续时间不是出于性能目的而存在,而是因为它们具有严重不同的语义;使缓冲区静态将极大地破坏代码的许多潜在用途,最明显的是多线程使用。对象应该具有静态存储持续时间的唯一时间是它存储需要在调用之间持久存在的长期全局状态,即使这样,它通常也是设计错误(此状态应保留在调用者持有的上下文中)。
话虽如此,静态存储持续时间的性能不太可能更好,并且在许多情况下(特别是PIC共享库或PIE可执行文件)访问静态变量将比访问自动变量慢,因为该函数必须加载GOT寄存器(如果尚未加载)并执行GOT间接寻址或GOT相对寻址。