将函数变量声明为局部而不是全局会不会影响效率?

Does not it affect the efficiency to declare a function variable as local instead of global?

我实际上已经通过测试看到了一些结果,但我想知道哪种方式更好以及为什么。

问题 #1: 当我一次又一次地调用该函数时,是否每次都声明了局部变量?我知道最好在尽可能窄的范围内声明变量。但我无法阻止自己考虑将其声明为全局变量并使其仅声明一次,而不是在每次函数调用中声明。或者,它是否在每次函数调用中再次声明?我知道局部变量的范围只是那个函数。所以当它离开那个函数时,它必须忘记那个变量,因为它超出了它的范围,对吗?

问题#2:当我有一些函数变量需要存储它以前的内容(例如定时器计数器变量)时,哪种方法更好:将它们声明为全局变量变量还是将它们声明为静态局部变量?每当我调用该函数时,我都不需要它们获取初始值,我已经在需要时将它们设置为零等。

Global variable - declared at the start of the program, their global scope means they can be used in any procedure or subroutine in the program

很少建议使用全局变量,因为它们容易导致错误、浪费内存并且在跟踪代码时很难跟踪。如果你声明一个全局变量,它会继续使用内存,而程序是 运行 即使你不再 need/use 它。

Local variable - declared within subroutines or programming blocks, their local scope means they can only be used within the subroutine or program block they were declared in

局部变量是在一个有限的范围内启动的,这意味着它们是在调用函数或子程序时声明的,一旦函数结束,变量占用的内存就会被释放。这与不释放内存的全局变量形成对比。


问题 #1: 是。 每次调用该函数时都会声明局部变量。离开函数后,它会忘记您在该范围内声明的变量。您还必须记住,当遇到某个变量时,程序将开始搜索它。所以当它更接近像在同一个范围内声明时,它会发现更快并且能够继续。此外,这将在您编码时更加高效,并且会导致更少的错误和错误等。

问题 #2: 如果你使用同一个变量有不同的功能,我强烈建议你将它们声明为 global定义,这将导致程序携带您的"counter"。因此,当您需要在旅行范围之间时,可以快速使用它。 但是在这些条件之后我必须强烈建议你:

avoid globals wherever possible (as @DevSolar said)

Question #1: Do local variables get declared every time when I call that function again and again?

A1: 是的,但这真的不是问题。

声明一个局部变量意味着 space 是在该函数的堆栈帧中为堆栈上的该变量创建的。声明一个全局变量意味着在可执行文件的数据部分(如果变量已初始化)或 BSS 部分(如果未初始化)为该变量创建 space。

在堆栈上分配是零成本的。在函数入口处,堆栈帧的大小会为函数的所有局部变量腾出空间。一个多一个少都无所谓。静态分配(对于全局变量)要快一点,但是你只能得到一个变量。这在以后的某个时候可能会成为一个大问题,例如如果你想让你的程序多线程,你的函数可重入,或者你的算法递归。它也可能成为调试过程中的一大麻烦,在您寻找错误时浪费数小时的非生产时间。

(这是所有的要点:性能差异真的可以忽略不计。另一方面,您可以浪费在充满全局变量的次优设计上的时间可能非常重要。)

Question #2: [...] which way is better: to declare them as a global variable or to declare them as a static local variable?

A2:从架构的角度来看,尽可能避免全局变量有一个很少有它们有意义的特定情况,但是当您看到它们时您就会知道它们。如果您可以在没有全局变量的情况下使其工作,请避免使用它们。 (实际上,对于静态局部变量也是如此。它们比全局变量更好,因为它们的范围有限,并且在某些情况下它们是有意义的,但局部变量实际上应该是您心目中的 "default" 。)

Q2:

在函数中使用静态变量通常更可取。主要原因是因为所有函数都可以访问全局变量,所以很难跟踪和调试你的程序。

Q1:

是的,每次所属函数运行时创建局部变量,结束时删除。

假设你的程序有5个函数(很少用到),每个函数使用6个局部变量。如果将它们全部更改为全局变量,则在程序的整个持续时间内,所有 30 个变量将占用 space,而不是偶尔创建和销毁 5 个变量。而且,allocation真的不会花太多时间。