变量声明对程序效率的重要性

The importance of variable declaration in relation to program efficiency

本文关键字:重要性 效率 程序 声明 变量      更新时间:2023-10-16

假设这里有一个类叫做Game。其他方法、构造函数和析构函数在我的例子中完全被忽略了,它们对我手头的问题不重要或不相关。

// Game.hpp
#pragma once
class Game { 
public:
    ...
    bool isRunning() { return mRunning; } // See: mRunning
    ...
private:
    bool mRunning; // Holds if the game is running or not
};

很简单,对吧?这里是我关注的地方:

// main.cpp
#include "Game.hpp"
int main(int argc, char* argv[]) {
    Game game;
    if (game.isRunning()) {
        ...
    }
    return EXIT_SUCCESS;
}

这两者的区别是什么?:

// main.cpp
#include "Game.hpp"
int main(int argc, char* argv[]) {
    Game game;
    bool running = game.isRunning();
    if (running) {
        ...
    }
    return EXIT_SUCCESS;
}

所以我的问题是:是否有任何性能损失/增益?我意识到这也适用于括号作用域。但是在性能方面,它得到优化了吗?这取决于编译器吗?

这取决于编译器来优化。函数可能是内联的,临时变量可能不会存储在寄存器之外的任何地方。

你在这里所做的其实是"过早优化",这是一种潜在的拖延形式,会阻止你真正编写游戏。首先编写你的游戏,然后找到瓶颈。这不会是其中之一

确定某事是否会影响性能的最佳方法是使用分析器检查它是否会

在这种情况下,性能不会受到影响,因为以这种方式声明单个变量使用了微不足道的内存和CPU时间,但这是一个很好的实践-特别是作为游戏开发人员,性能就是一切-学习分析自己的代码的性能。

空间效率方面有一个明显的(尽管微不足道的)缺点。速度效率方面,从技术上讲,第一种方法更有效,但同样,这是微不足道的,无关紧要。只有在-

bool running = game.isRunning();
loop(...){
    if(running);
}

在这种情况下,存储变量将以一种潜在的显著方式提高效率(特别是当isRunning成为一个更复杂的函数时)。

该函数是在类的声明中定义的,因此它是隐式的inline,该定义对包括头文件在内的任何内容都是可见的。大多数现代编译器在打开优化后,会在这里做正确的事情。

但是,如果您要将Game::isRunning()的实现拉到单独的翻译单元(例如"源文件")中,则每次调用isRunning()时都会遭受函数调用开销。至于这是否重要,那就是另一回事了。

还请注意,某些编译器的某些配置将不能很好地优化isRunning()成员函数的代码,因为并不是所有的事情都发生在内联之后。你几乎不应该担心这个