全局变量和局部变量哪个更有效?
Are global or local variables more efficient?
在游戏中计算渲染最后一帧所需的时间(delta time)是很常见的,以便产生平滑的运动、计时器等。
一种方法是声明3个全局变量:float deltaTime, currentTime, elapsedTime;
然后计算游戏循环开始时的增量时间:
currentTime = getTime();
deltaTime = currentTime - elapsedTime;
elapsedTime = currentTime;
(其中getTime()是返回程序启动后的时间的函数)
另一种方法是将deltaTime和currentTime声明为局部变量:float currentTime = glfwGetTime();
float deltaTime = currentTime - elapsedTime;
elapsedTime = currentTime;
如果我的理解是正确的,那么编译器必须在循环结束时重新分配变量的内存,并且在循环的下一次迭代中再次重新分配它,导致它比仅仅声明全局变量更低效。
这是正确的,还是有一些其他的东西自动发生在后台,我不知道?
如果我的理解是正确的,那么编译器必须在循环结束时重新分配变量的内存,并且在循环的下一次迭代中再次重新分配它,导致它比仅仅声明全局变量更低效。
那不是真的。
编译器不会为循环中的局部变量分配和释放内存。函数中局部变量的内存通常在创建函数的堆栈帧时分配。
变量在每次循环运行时初始化。
如果变量是具有构造函数和析构函数的类类型,则它们将在每次循环运行时被调用,这可能是昂贵的,这取决于构造函数和析构函数中发生的事情,以及循环运行的次数。
对于float
类型,不应该因为在循环中使用局部变量而产生任何开销。
extern float getTime();
float deltaTime, currentTime = getTime(), elapsedTime = getTime();
float time_it()
{
currentTime = getTime();
deltaTime = currentTime - elapsedTime;
elapsedTime = currentTime;
return deltaTime;
}
对象代码:
time_it():
sub rsp, 8
call getTime()
vmovss DWORD PTR currentTime[rip], xmm0
vmovaps xmm1, xmm0
vsubss xmm0, xmm0, DWORD PTR elapsedTime[rip]
vmovss DWORD PTR elapsedTime[rip], xmm1
vmovss DWORD PTR deltaTime[rip], xmm0
add rsp, 8
ret
重要的是什么?
call getTime()
-迄今为止所有系统上最昂贵的操作
vmovss DWORD PTR currentTime[rip], xmm0
one memory write
一次内存获取:vsubss xmm0, xmm0, DWORD PTR elapsedTime[rip]
两个内存写入,其中一个是冗余的。
vmovss DWORD PTR elapsedTime[rip], xmm1
vmovss DWORD PTR deltaTime[rip], xmm0
在全局变量中存储deltaTime的总开销是一次内存写入。性能方面没有什么值得兴奋的,但风格方面肯定不受欢迎。
避免全局变量的原因与性能无关,而是与避免紧耦合有关。
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 返回对局部变量 - C++ 的引用
- 在 pthread_create() 中使用局部变量作为参数有效吗?
- 局部变量的返回地址和程序仍然有效
- 全局变量和局部变量哪个更有效?