首页 > 解决方案 > 函数局部静态变量:从性能角度看的优缺点

问题描述

纯粹从性能的角度来看,函数局部静态变量的优缺点是什么?

这是一个例子:

// 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
}

哪个版本会更快?它会永远更快吗?在什么情况下,使用静态局部变量来提高性能可能会自取其辱?

非常感谢您的帮助!

标签: c++performancestaticlocal

解决方案


这个问题太宽泛了,一般无法回答。但是,我只想分享我在开发一些实际应用程序方面的经验。正如@Aconcagua 在评论中指出的那样,如果辅助(未返回)本地对象的初始化或使用成本很高,则制作它并重用static它可能会显着加快速度。这发生在我们的案例中,尤其是辅助局部向量,其中重用避免了堆分配。相比

void f() {
  std::vector<...> v;
  ...  // at least one allocation required in each call when inserting elements
}

void f() {
  static std::vector<...> v;
  v.clear();
  ...  // no allocation required if elements fit into capacity
}

这同样适用于(非小)字符串。当然,如果可以通过这种方式创建非常大的向量/字符串,则应该注意这种方法可能会大大增加进程 RSS(映射到 RAM 的内存量)。

在多线程应用程序中,我们只thread_local使用static.


另一方面,对于基本类型的小对象(例如示例代码中的整数或指针),我敢说制作它们static可能会导致更多的内存访问。使用非静态变量,它们更有可能只映射到寄存器。对于静态变量,它们的值必须在函数调用之间保留,这很可能导致它们存储在内存中


推荐阅读