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

C中的static关键字可以用来提高性能吗?,c,static,C,Static,执行以下操作之间是否存在性能差异: void function() { char bufgfer[256]; // ... } 及 我知道它改变了功能的工作方式,但性能如何?第二个更快吗 hanks如果缓冲区最终位于CPU附近的缓存中,则第一个可能会更快 如果您认为第一个比较慢,因为缓冲区会在运行时分配,那么,不,这不是原因。所有这些都由编译器在编译时处理。此外,将缓冲区设为静态可能会使其脱离缓存。(但谁知道,谁在乎呢?) 在我看来,您正在考虑过早的优化。如果缓冲区最终位于CPU附近的缓存中,

执行以下操作之间是否存在性能差异:

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

我知道它改变了功能的工作方式,但性能如何?第二个更快吗


hanks

如果缓冲区最终位于CPU附近的缓存中,则第一个可能会更快

如果您认为第一个比较慢,因为缓冲区会在运行时分配,那么,不,这不是原因。所有这些都由编译器在编译时处理。此外,将缓冲区设为静态可能会使其脱离缓存。(但谁知道,谁在乎呢?)


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

如果缓冲区最终位于CPU附近的缓存中,那么第一个优化可能会更快

如果您认为第一个比较慢,因为缓冲区会在运行时分配,那么,不,这不是原因。所有这些都由编译器在编译时处理。此外,将缓冲区设为静态可能会使其脱离缓存。(但谁知道,谁在乎呢?)


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

有时可能会,有时可能会更慢,这取决于函数中的其他变量,它所做的是访问


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

有时可能是静态的,有时可能是较慢的,这取决于函数中的其他变量,它所做的就是访问


最重要的是在需要时使用它,而不是在优化方面,而是在功能方面。如果不需要变量是静态的,那么它就不应该是静态的,不同平台上的含义在大多数情况下都是无关的。

切勿根据性能选择对象的存储持续时间(静态与自动)。存储持续时间的存在并非出于性能目的,而是因为它们具有严重不同的语义;将缓冲区设为静态将极大地破坏代码的许多潜在用途,最明显的是多线程用途。对象应该具有静态存储持续时间的唯一时间是当它存储需要在调用之间保持的长期全局状态时,即使这样,这通常也是一个设计错误(该状态应该保存在调用方持有的上下文中)


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


尽管如此,静态存储持续时间不太可能提高性能,在许多情况下(尤其是PIC共享库或PIE可执行文件),访问静态变量的速度会比访问自动变量的速度慢,因为函数必须加载GOT寄存器(如果尚未加载)并且确实得到了间接寻址或相对寻址。

理论上是的,因为缓冲区可能只分配一次,但第一个缓冲区只是堆栈上的一个减法,只有在多次调用此函数时才会真正注意。有时可能会,有时可能会更慢,这取决于函数中的其他变量,它的作用是访问。@RedX-这不太准确。堆栈上的分配可以是对堆栈指针的简单更改,如果有其他变量,则可以在相同的更改中完成。如果堆栈上有一些变量和一个静态变量,它们位置的差异可能会降低性能。@BinyaminSharet你是对的,我知道这一点。也许我应该更恰当地表达我的评论。但感谢您指出。当使用静态缓冲区的版本在多个线程运行时停止执行时,相关的性能差异就会变得明显。理论上是的,由于缓冲区可能只分配一次,但第一个缓冲区只是堆栈上的一个减法,只有在多次调用此函数时才会引起注意。有时可能会,有时可能会更慢,这取决于函数中的其他变量,其作用是访问。@RedX-这不太准确。堆栈上的分配可以是对堆栈指针的简单更改,如果有其他变量,则可以在相同的更改中完成。如果堆栈上有一些变量和一个静态变量,它们位置的差异可能会降低性能。@BinyaminSharet你是对的,我知道这一点。也许我应该更恰当地表达我的评论。但感谢您指出这一点。当使用静态缓冲区的版本在多线程运行时停止执行时,相关的性能差异就会变得明显。感谢您,这就是我所寻找的答案:我认为不必为每个函数调用在堆栈上创建缓冲区会更快,显然我错了谢谢这是我想要的答案:我认为不必为每个函数调用在堆栈上创建缓冲区会更快,显然我错了
void function() {
static char bufgfer[256];
// ...
}