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

abd*_*nar 2 c variable-declaration

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

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

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

Dev*_*lar 5

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

A1:是的,但这不是一个问题.

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

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

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

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

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

  • @abdullahcinar:单元测试是一种技术,对于程序中的每个"功能单元"(比如一个函数),你可以编写一个"测试驱动程序",即可执行文件,可执行文件中的几个函数等,*测试*该单位(孤立地).如果我把`-1`放进去,它会按预期产生错误信息吗?如果我把'0`放进去,它会给'0`作为返回值吗?如果我把一个正值放入其中,它是否进行了正确的计算?然后可以在自动环境中执行该测试驱动程序.你运行`make && make test`并立即查看你的更改是否破坏了什么. (2认同)