如何避免将此变量放在堆栈上

How can I avoid putting this variable on the stack?

本文关键字:堆栈 变量 何避免      更新时间:2023-10-16

我目前正在调整一些示例Arduino代码以满足我的需求。以下片段使我感到困惑:

// Dont put this on the stack:
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];

buf变量放在堆栈上是什么意思?我该如何避免这样做?如果我这样做可能会发生什么坏事?

程序堆栈的尺寸有限(即使在台式计算机上,它通常在兆字节上封顶,在arduino上,它可能会小得多)。

所有功能函数的局部变量以Lifo方式存储在那里;您的main方法的变量位于堆栈的底部,其顶部在main中调用的函数的变量,依此类推;空间(通常)保留在输入函数时,并且直到函数返回之前才回收。如果功能分配了真正巨大的缓冲区(或呼叫链中的多个功能分配稍小的缓冲区),则可以快速接近堆栈限制,这会导致您的程序崩溃。

听起来您的数组是在函数的外部分配的,将其放在全局范围内。缺点是只有一个共享缓冲区(因此,两个函数不能同时使用它而不协调访问,而堆栈缓冲区将独立保留每个功能),但上升空间是它不花费堆栈来堆栈用它;它是从程序内存的单独部分分配的(通常是无限的部分,或者至少在千兆内有限制,而不是兆字节范围)。

所以回答您的问题:

buf变量放在堆栈上是什么意思?

如果它会在堆栈上:

  1. 在功能范围而不是全局范围中声明,
  2. 并未将其声明为static(或thread_local,尽管这比您现在应该关注的要复杂得多);如果在功能范围中声明为static,则基本上是全局内存,只能在该特定函数中直接引用

如何避免这样做?

不要在功能范围内声明巨大的非static数组。

如果我这样做会发生什么坏事?

如果阵列足够大,您可能会因用完可用的堆栈空间而遭受堆栈的溢出,使您的程序崩溃。