所以,假设我在这里有一个叫做“游戏”的课程。在我的例子中,其他方法,构造函数和析构函数完全被忽略,并且与我手头的问题不重要或无关。
// 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;
}
所以这是我的问题:手头有任何性能损失/收益吗?这也适用于我意识到的支架范围。但就性能而言,这是否会得到优化?是由编译器决定的吗?
答案 0 :(得分:3)
由编译器来优化它。该函数可能会被内联,并且临时变量可能不会存储在寄存器以外的任何位置。
你在这里实际做的是“过早优化”,这是一种阴险的拖延形式,会阻止你实际编写你的游戏。先写下你的游戏,然后找出瓶颈。这不是其中之一。
答案 1 :(得分:2)
确定某些内容是否会影响性能的最佳方法是使用分析器检查它是否。
在这种情况下,性能不会受到影响,因为以这种方式声明单个变量会占用琐碎的内存和CPU时间,但这是一个很好的做法 - 特别是作为游戏的开发者,性能就是一切 - 学习分析你自己的表现代码。
答案 2 :(得分:2)
空间效率明显存在明显(虽然微不足道)的劣势。速度效率明智,技术上第一个更有效率,但同样,它是如此微不足道无关紧要。这可能很重要的唯一情况是 - 如果你有 -
bool running = game.isRunning();
loop(...){
if(running);
}
在这种情况下,存储变量会以一种潜在的显着方式提高效率(特别是如果isRunning变为更复杂的函数)。
答案 3 :(得分:1)
该函数在您的类的声明中定义,因此它隐式inline
,并且包含您的标题在内的任何内容都可以看到该定义。大多数现代编译器都会在优化开启的情况下做正确的事情。
但是,如果您要将Game::isRunning()
的实现拉入单独的翻译单元(想想“源文件”),那么每次调用isRunning()
都会遇到函数调用开销。这是否重要是一个不同的故事。
另请注意,某些编译器的某些配置不会使用isRunning()
成员函数优化代码,因为并非所有内容都在内联后发生。你几乎肯定不应该担心这一点。