作为一个例子,我在一些OpenGL应用程序中有以下绘图功能:
void Terrain::Draw(float ox, float oy, float oz) {
float terrainWidth = stepWidth * (width - 1.0f);
float terrainLength = stepLength * (length - 1.0f);
float startWidth = (terrainWidth / 2.0f) - terrainWidth;
float startLength = (terrainLength / 2.0f) - terrainLength;
(...)
}
Terrain
是一个类,我确信步和地形宽度/长度实例变量在对象的生命周期内永远不会改变(它们在第一次调用绘制函数之前被初始化)。 / p>
假设我的应用程序以稳定的25fps运行,该函数将被调用25次。价值永远不会改变,它们永远都是一样的。
我将这些函数变量声明为静态会获得什么吗?为了防止它们在每次调用函数时被销毁和声明?
答案 0 :(得分:2)
编译器如今擅长微观优化,几乎不可能就是否会改进或减慢你的程序做出明确的陈述。
你必须确定基准才能确定。
答案 1 :(得分:1)
是的,当你在那里时,也要const
。这两个都可以提示编译器优化这些函数变量。
虽然差异很小,但每秒至少需要25,000次电话才能使这一点变得有价值。
答案 2 :(得分:1)
我会将这些函数变量声明为静态吗?
它确实是一小部分数据:除非你有大量的实例,否则不要打扰。
为了防止它们在每次调用函数时被销毁和声明?
这通常采用以下形式:
class Terrain {
public:
// interface
protected:
// more stuff
private:
// ... existing variables
const float d_terrainWidth;
const float d_terrainLength;
const float d_startWidth;
const float d_startLength;
};
然后您可以使用Draw
实施中预先计算的不变量。