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