0

因此,假设我在这里有一门名为“游戏”的课程。在我的示例中,其他方法、构造函数和析构函数被完全忽略,并且与我手头的问题无关紧要。

// 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;
}

所以这是我的问题:手头是否有任何性能损失/收益?这也适用于我意识到的括号范围。但就性能而言,这是否得到优化?这取决于编译器吗?

4

4 回答 4

3

由编译器来优化它。该函数可能会被内联,并且临时变量可能不会存储在寄存器以外的任何地方。

你实际上在这里做的是“过早的优化”,这是一种阴险的拖延形式,会阻止你真正编写你的游戏。先写游戏,再找瓶颈。这不会是其中之一。

于 2013-06-11T03:43:19.003 回答
2

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

在这种情况下,性能不会受到影响,因为以这种方式声明单个变量会占用微不足道的内存和 CPU 时间,但学习分析自己的代码是一种很好的做法——尤其是作为游戏开发者,性能就是一切为了表现。

于 2013-06-11T03:32:11.290 回答
2

在空间效率方面,有一个明显(尽管微不足道)的缺点。速度效率方面,从技术上讲,第一个效率更高,但同样,它是如此微不足道,没关系。这可能很重要的唯一情况是,如果您有 -

bool running = game.isRunning();

loop(...){
    if(running);
}

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

于 2013-06-11T03:34:04.247 回答
1

该函数是在您的类的声明中定义的,因此它是隐式的inline,并且该定义对包括标题在内的任何内容都是可见的。大多数现代编译器会在开启优化的情况下在这里做正确的事情。

但是,如果您要将 的实现拉Game::isRunning()入一个单独的翻译单元(想想“源文件”),您将在每次调用 it 时遭受函数调用开销isRunning()。这是否重要是另一回事。

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

于 2013-06-11T05:02:45.843 回答