函数局部静态变量的优缺点是什么?[[纯粹从性能的角度来看?
这里是一个例子:// version 1
void func(/*some arguments here*/)
{
int64_t x;
int32_t y = 0;
void * p = 0;
// do something here
}
// version 2
void func(/*some arguments here*/)
{
static int64_t x;
static int32_t y; y = 0;
static void * p; p = 0;
// do something here
}
哪个版本会更快?会永远更快吗?在什么情况下可以通过使用静态局部变量来提高性能?非常感谢您的帮助!
static
并重新使用可能会导致明显的加速。这在我们的情况下尤其是在使用辅助局部向量的情况下会发生,其中重用避免了堆分配。比较void f() {
std::vector<...> v;
... // at least one allocation required in each call when inserting elements
}
with
void f() { static std::vector<...> v; v.clear(); ... // no allocation required if elements fit into capacity }
对(非小)字符串也是如此。当然,如果可以通过这种方式创建非常大的向量/字符串,则应该意识到这种方法可能会大大增加进程RSS(映射到RAM的内存量)。在多线程应用程序中,我们只使用
thread_local
而不是static
。
另一方面,对于小的对象,基本上是基本类型(例如示例代码中的整数或指针),我敢说将它们设为static
可能会导致更多的内存访问。使用非静态变量,它们更有可能仅映射到寄存器。使用静态变量时,必须在函数调用之间保留其值,这很可能导致它们的存储在内存中。