首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++局部变量,性能

C++局部变量,性能
EN

Stack Overflow用户
提问于 2020-10-09 21:28:27
回答 3查看 112关注 0票数 0

我只是想知道当函数作用域中的变量始终相同且不变时会发生什么,例如

代码语言:javascript
复制
void test()
{
    int x = 10;
}

我知道编译器会存储关于它的名称、大小等信息,但在这种情况下,它会同时缓存它的值吗?

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

EN

回答 3

Stack Overflow用户

发布于 2020-10-09 21:39:31

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

与在没有这些变量的情况下实现相同的开销相比,局部自动变量很少有开销。要验证程序中是否存在这种情况,您可以进行测量。

在示例函数的情况下,它可能被优化为无操作,并且不会留下任何局部变量的痕迹。

成员变量通常不能被优化,因此添加那些不必要的变量很容易影响性能。效果是否显着,你可以通过测量来发现。

票数 1
EN

Stack Overflow用户

发布于 2020-10-09 21:39:44

就像注释中提到的,如果你检查为这类代码生成的程序集,你会发现这个变量被优化掉了(在任何意义上都不会存在)。

如果你有一个像这样的函数:

代码语言:javascript
复制
int test()
{
    int x = 10;
    return x;
}

也不会创建变量,但编译器会简单地让您的函数返回10。

关于性能的要点,除非你已经有了一个可测量的性能问题,否则我根本不会担心你的常量存储在哪里。

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

对此进行研究的有用链接包括:

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

这是在代码中测量性能的绝佳答案:https://stackoverflow.com/a/60293070/567070

票数 1
EN

Stack Overflow用户

发布于 2020-10-09 21:40:18

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

无优化:

https://godbolt.org/z/Ej6ado

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

使用-O1实现最低可能的优化:

https://godbolt.org/z/dnesvs

代码中提到的变量被完全优化掉了,因为没有使用它:函数什么也不做,立即返回。

将变量设置为成员变量可能是有害的,因为从理论上讲,这将允许它在函数调用之间甚至在函数执行期间进行更改。如果它是一个常量变量,只需在你的函数中声明为'const‘,不用担心优化问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64281069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档