函数局部静态变量:从性能角度考虑的利弊

问题描述 投票:0回答:2

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

这里是一个例子:

// 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++ performance static local
2个回答
1
投票
此问题范围太广,无法普遍回答。但是,我只是分享一些实际应用程序开发的经验。正如@Aconcagua在评论中所指出的那样,如果辅助(未返回)本地对象的初始化或使用成本很高,则将其设为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可能会导致更多的内存访问。使用

非静态变量,它们更有可能仅映射到寄存器。使用静态变量时,必须在函数调用之间保留其值,这很可能导致它们的存储在内存中


-3
投票
静态变量和局部变量之间的区别如果要在函数中保留最后一个值,请使用静态变量。每次函数调用时都会初始化局部变量。有关内存memory management的更多信息。关于速度,局部变量在堆栈上,可以缓存。
© www.soinside.com 2019 - 2024. All rights reserved.