c++ - Arduino/C++ GlobalVars 与局部变量

标签 c++ arduino global

我现在正在做一个 Arduino 项目。它的作用基本上是这样的:

  1. 从PC读取串口数据
  2. 解析接收到的数据
  3. 使用这些数据在 TFT 屏幕上绘图。

我目前的方法大量使用全局变量。没有它们,我将不得不使用一些嵌套函数来传递 3 层深的变量。这让我开始思考哪种方法在性能方面更好。这是两个例子。

首先是本地:

void setup() {
  Serial.begin(9600);
  Serial.println(firstFunction(10));
}

int firstFunction(int val)
{
  return secondFunction(val+1);
}

int secondFunction(val)
{
  return thirdFunction(val+1);
}

int thirdFunction(val)
{
  return val + 1;
}

全局:

int x; //global var
void setup() {
  Serial.begin(9600);
  firstFunction(10);
  Serial.println(x);
}
void firstFunction(int val)
{
  x = val;
  x += 1;
  secondFunction();
}
void secondFunction()
{
  x++;
  thirdFunction();
}
void thirdFunction(val)
{
  x++;
}

在 PC 方面,使用全局变量通常是不受欢迎的。但我的理解是,这主要是出于样式和可扩展性的原因。

大家怎么看?

最佳答案

根据您的项目的复杂程度,任何一种方法都是可行的。

反对通过函数调用堆栈将变量作为参数传递的一个考虑因素是您的微芯片上的内存量非常有限。每个局部变量和每个函数参数都放在你的堆栈上,在你的情况下,你在堆栈上多次基本相同的变量,浪费你的内存。根据您的 µC 上的 RAM 量,一旦您开始使用字符串和其他您想要在运行时操作的更大结构,这可能会变得棘手。

如果您注意到您的 µC 突然开始出现异常 - 崩溃、挂起、产生垃圾输出等 - 可能是您的堆栈下溢到堆中或相反。如果您首先尝试避免像这样不必要的变量拷贝,那么这不太可能成为问题。

当然,根据您的程序的工作方式,反之亦然:如果您必须有一些状态,您只需要在程序的特定部分跟踪,并且您不会调用许多嵌套函数在那里,最好将它保存在传递的局部变量中,因为一旦您从外部函数返回,该变量就会再次消失。

基本上,根本区别在于全局变量始终存在并在程序运行的整个过程中占据空间,而局部变量只有在创建它们的函数返回时才会这样做 - 但函数参数就像局部变量函数,因此将变量传递给另一个函数会创建第二个拷贝。所以,它总是有两个方面。

但是,随着复杂性的增加,我肯定会使用类 - 按职责划分 - 带有成员或静态变量和相应的方法,而不仅仅是一堆全局变量。

那么您仍然可以将事物很好地捆绑在一起,而不只是松散地漂浮在全局空间中,但您并没有浪费内存。

关于c++ - Arduino/C++ GlobalVars 与局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37343447/

相关文章:

C++ 运算符重载或重新定义?

assembly - 如何计算汇编中两个 8 位值的 8 位平均值?

r - assign( ... , envir = ... ) 和 environment( ... ) = 之间的区别

c - 有没有办法让我的补充代码更加高效并允许一次多个输出?

javascript - 如何让浏览器通过非屏幕 channel 输出?

android - 多个 Activity 上的相同按钮

Python - 定义多个全局变量的最简单方法

c++ - 使用 pthread_cancel : good practice or bad 取消线程

c++ - 为什么复制赋值运算符必须返回引用/常量引用?

c++ - 从远程计算机连接到 mssql 服务器会导致用户 '' 登录失败