[英]The importance of variable declaration in relation to program efficiency
假设我这里有一个叫做“游戏”的课程。 在我的示例中,其他方法,构造函数和析构函数被完全忽略,并且与我手头的问题无关紧要。
// 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()
成员函数优化代码,因为内联之后并非所有操作都会发生。 您几乎可以肯定不必为此担心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.