它是否会影响将函数变量声明为本地而非全局的效率?

时间:2016-08-02 06:39:01

标签: c variable-declaration

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

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

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

3 个答案:

答案 0 :(得分:5)

  

问题#1:每次我再次调用该函数时,是否会声明局部变量?

A1 ,但这不是问题。

声明局部变量意味着在该函数的堆栈帧内为堆栈上的该变量创建空间。声明变量global表示在可执行文件的数据部分(如果变量已初始化)或BSS部分(如果不是)中为该变量创建空间。

在堆栈上分配是零成本。在函数入口处,堆栈框架的大小适合为函数的所有局部变量腾出空间。一个或多或少并不重要。静态分配(对于全局变量)要快一点,但只能获得一个变量。这可能在稍后的某个时刻成为一个巨大的问题,例如如果你想让你的程序多线程,你的函数可重入,或你的算法递归。它也可能成为调试过程中的一个主要麻烦,在你追捕那个bug时会浪费几个小时的非生产时间。

(这是这一切的主要观点:性能差异实际上可以忽略不计。另一方面,你可以浪费在不太理想的全局设计上的时间可能非常重要。)

  

问题#2: [...]哪种方式更好:将它们声明为全局变量或将它们声明为静态局部变量?

A2 :从架构的角度来看,尽可能避免全局 。有一些具体案例,它们是有意义的,但你知道你看到他们的时候。如果你可以在没有全局变量的情况下使它工作,请避免它们(实际上,对于静态局部变量也是如此。它们比全局变量更好,因为它们的范围有限,并且有些情况下它们有意义,但局部变量应该是你脑海中的“默认”。)

答案 1 :(得分:1)

  

全局变量 - 在程序开始时声明,它们的全局范围意味着它们可以在任何过程或子程序中使用   该计划

使用全局变量很少是可取的,因为它们容易导致错误,浪费内存并且在跟踪代码时很难遵循。如果声明一个全局变量,它将在程序运行时继续使用内存,即使你不再需要/使用它。

  

局部变量 - 在子程序或编程块中声明,它们的局部范围意味着它们只能在   它们在

中声明的子程序或程序块

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

问题#1: 是。每次反复调用该函数时,都会声明局部变量。在它离开函数之后,它会忘记你在该范围内声明的变量。您还必须记住,当某个变量面临时,程序将开始搜索它。因此,当它更接近于在同一范围内声明时,它会更快找到并能够继续。在编码时这也会更有效率,并且会减少错误和错误等。

问题2:如果您使用具有不同功能的相同变量,我强烈建议您将它们声明为全局定义,这将导致程序随身携带你的“柜台”。因此,当您需要在旅行的范围之间时,可以快速使用它。 在这些条件之后我必须强烈建议你:

  

尽可能避免全局 (正如@DevSolar所说)

答案 2 :(得分:1)

Q2:

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

Q1:

是的,每次运行它所属的函数时都会创建局部变量,并在结束时删除它们。

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