性能:我应该在经常被调用的函数中使用全局变量吗?

时间:2014-08-01 11:02:56

标签: c++ c performance embedded global-variables

首先,让我了解一下,我是一个尝试以正确的方式做事的新手,这意味着我时不时地纠正什么是正确的方式。

我正在修改包含函数的外设的驱动程序 - 让我们调用它Send()。在函数中我有一个timestamp变量,因此函数循环一段指定的时间。

所以,我应该声明变量global(这样它总是在内存中,每次函数运行时都没有时间丢失)或者我将变量local留在函数上下文中(并避免设计错误)具有全局变量的模式)?

请记住,每毫秒可以多次调用该函数。

4 个答案:

答案 0 :(得分:5)

对于本地变量和全局变量,执行速度不应该有显着差异。唯一真正的区别在于变量的存在。局部变量在堆栈上分配,全局变量在不同的内存段中。确实,每次输入例程时都会分配局部变量,但分配内存是移动堆栈指针的单个指令。

在决定变量是全局变量还是本地变量时,还有更重要的考虑因素。

答案 1 :(得分:4)

实施驱动程序时,尽量避免使用全局变量,因为:

  1. 它们是线程不安全的,你不知道用户应用程序的调度方案(实际上,即使没有线程,使用相同驱动程序的多个实例也是一个潜在的问题)。

  2. 它会自动生成data-section的创建,作为链接到驱动程序的任何应用程序的可执行映像的一部分(这是应用程序员可能想要避免的)。

答案 2 :(得分:2)

您是否分析了代码的完全优化的发布版本,并确定了此函数中的小分配瓶颈?

您提出的改变是微观优化;更改为代码的一小部分,旨在提高代码效率。如果上述问题的问题是"否"正如我所期望的那样,你甚至不应该考虑这些事情。

为您的代码选择正确的算法。使用惯用技术编写代码。不要写微观优化。您可能会惊讶于编译器在为您优化代码方面有多好。它通常能够优化掉这些小额分配,但即使它仍然无法知道它们所施加的性能损失是否显着或显着。

答案 3 :(得分:0)

对于驱动程序,通常与位置无关,除非IP相关操作可用(即x86_64,ARM等),否则使用GOT表间接访问全局变量

对于GOT,您可以将其视为额外的间接指针。

然而,即使有一个额外的指针,如果它只是以毫秒频率调用它,它也不会产生任何可观察到的差异。