c++ - 函数局部静态变量:从性能角度看的优缺点
问题描述
纯粹从性能的角度来看,函数局部静态变量的优缺点是什么?
这是一个例子:
// 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
}
哪个版本会更快?它会永远更快吗?在什么情况下,使用静态局部变量来提高性能可能会自取其辱?
非常感谢您的帮助!
解决方案
这个问题太宽泛了,一般无法回答。但是,我只想分享我在开发一些实际应用程序方面的经验。正如@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
可能会导致更多的内存访问。使用非静态变量,它们更有可能只映射到寄存器。对于静态变量,它们的值必须在函数调用之间保留,这很可能导致它们存储在内存中。
推荐阅读
- python - 在 matplotlib 中绘制特定元素值
- laravel - 合并表单请求验证以进行存储和更新
- vue.js - 将组件导入Vue路由器不起作用
- sql - 是否可以只向表中添加一列?(甲骨文)
- node.js - 使用 express 运行 vue 时出现 cors 错误
- powerbi - 如何将上月值与当月收入相加并在 Power BI 中显示当月
- elasticsearch - 属性不可用于 kibana 中的可视化
- batch-file - 如何替换大于预定义值的字母和小数组合的所有实例
- python - 如何根据执行时间在Python中返回两个不同的值?
- node.js - 我将如何使用 DynamoDB DocumentClient 重写此查询?