我只是想知道当函数作用域中的变量始终相同且不变时会发生什么,例如
void test()
{
int x = 10;
}我知道编译器会存储关于它的名称、大小等信息,但在这种情况下,它会同时缓存它的值吗?
我的想法是,如果这是一个每秒使用60或140次的成员函数。它会对性能有什么影响,是否应该将其作为成员变量移动以提高性能?
发布于 2020-10-09 21:39:31
除了调试符号:不,编译器通常不存储局部变量的名称。
与在没有这些变量的情况下实现相同的开销相比,局部自动变量很少有开销。要验证程序中是否存在这种情况,您可以进行测量。
在示例函数的情况下,它可能被优化为无操作,并且不会留下任何局部变量的痕迹。
成员变量通常不能被优化,因此添加那些不必要的变量很容易影响性能。效果是否显着,你可以通过测量来发现。
发布于 2020-10-09 21:39:44
就像注释中提到的,如果你检查为这类代码生成的程序集,你会发现这个变量被优化掉了(在任何意义上都不会存在)。
如果你有一个像这样的函数:
int test()
{
int x = 10;
return x;
}也不会创建变量,但编译器会简单地让您的函数返回10。
关于性能的要点,除非你已经有了一个可测量的性能问题,否则我根本不会担心你的常量存储在哪里。
您将很难衡量任何性能影响。
对此进行研究的有用链接包括:
https://godbolt.org/来试用您的代码并查看生成的程序集(记得设置编译器标志)
这是在代码中测量性能的绝佳答案:https://stackoverflow.com/a/60293070/567070
发布于 2020-10-09 21:40:18
优化的程度取决于您的编译设置。godbolt.org允许您编译代码并查看编译后的输出。在本例中,gcc9.2根据优化标志以不同的方式编译代码。
无优化:
局部变量被压入堆栈,然后立即从堆栈中弹出。
使用-O1实现最低可能的优化:
代码中提到的变量被完全优化掉了,因为没有使用它:函数什么也不做,立即返回。
将变量设置为成员变量可能是有害的,因为从理论上讲,这将允许它在函数调用之间甚至在函数执行期间进行更改。如果它是一个常量变量,只需在你的函数中声明为'const‘,不用担心优化问题。
https://stackoverflow.com/questions/64281069
复制相似问题