C ++局部变量,性能

问题描述

例如,我只是想知道当函数范围中的变量始终相同且不更改时会发生什么情况

void test()
{
    int x = 10;
}

我知道编译器会存储有关其名称,大小等信息,但是在这种情况下,它还会缓存其值吗?

我的想法是,是否这是每秒使用60或140次的成员函数。它会对性能产生什么影响,是否应将其作为成员变量移动以提高性能

解决方法

除调试符号外:否,编译器通常不存储局部变量的名称。

与不使用局部自动变量相比,局部自动变量很少具有开销。要验证程序中是否存在这种情况,可以进行测量。

在使用示例函数的情况下,可能会将其优化为无操作,并且不会留下任何剩余的局部变量。

通常无法优化成员变量,因此不必要地添加这些变量很容易影响性能。效果是否显着,可以通过测量来找出。

,

就像注释中提到的,如果您检查为此类代码生成的程序集,您会看到该变量已被优化(甚至在任何意义上都不存在)。

如果您要具有以下功能:

int test()
{
    int x = 10;
    return x;
}

也不会创建任何变量,但是编译器只会让您的函数返回10。

关于性能的要点,除非您已经存在可衡量的性能问题,否则我将完全不用担心常量存储在何处。

您将很难衡量任何性能影响。

重新搜索的有用链接包括:

https://godbolt.org/试用您的代码并查看生成的程序集(请记住设置编译器标志)

关于在代码中衡量性能的出色答案:https://stackoverflow.com/a/60293070/567070

,

此优化的优化程度取决于您的编译设置。 godbolt.org允许您编译代码并查看编译后的输出。 在此示例中,gcc9.2根据优化标志以不同的方式编译代码。

没有优化:

https://godbolt.org/z/Ej6ado

局部变量被压入堆栈,然后立即从堆栈中弹出。

使用-O1进行的最低优化:

https://godbolt.org/z/dnesvs

您的代码中提到的变量已被完全优化,因为它未被使用:该函数不执行任何操作并立即返回。

使变量成为成员变量可能有害,因为从理论上讲,这将允许它在函数调用之间甚至在函数执行期间进行更改。如果它是一个常量变量,只需在您的函数中将其声明为“ const”即可,而不必担心优化。