c++ - 我怎样才能避免把这个变量放在堆栈上?

标签 c++ arduino stack global-variables

我目前正在改编一些示例 Arduino 代码以满足我的需要。以下片段让我感到困惑:

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

buf 变量入栈是什么意思?我怎样才能避免这样做?如果我这样做会发生什么坏事?

最佳答案

程序堆栈的大小有限(即使在台式计算机上,它通常以兆字节为上限,而在 Arduino 上,它可能要小得多)。

函数的所有函数局部变量都以后进先出的方式存储在那里; main 方法的变量在栈底,main 中调用的函数的变量在栈顶,等等;空间(通常)在进入函数时保留,并且在函数返回之前不会被回收。如果一个函数分配了一个真正巨大的缓冲区(或者调用链中的多个函数分配了稍小的缓冲区),您可能会迅速接近堆栈限制,这将导致您的程序崩溃。

听起来您的数组是在函数的外部 分配的,将其置于全局范围内。这样做的缺点是只有一个共享缓冲区(因此两个函数不能在不协调访问的情况下同时使用它,而堆栈缓冲区将为每个函数独立保留),但好处是它不需要堆栈成本用它;它是从程序内存的一个单独部分分配的(该部分通常是无限制的,或者至少有千兆字节的限制,而不是兆字节范围)。

所以回答你的问题:

What does it mean to put the buf variable on the stack?

如果满足以下条件,它就会在堆栈上:

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

How can I avoid doing this?

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

What bad things could happen if I did it?

如果数组足够大,您可能会因用完可用堆栈空间而导致堆栈溢出,从而导致程序崩溃。

关于c++ - 我怎样才能避免把这个变量放在堆栈上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46437423/

相关文章:

c++ - 使用表达式初始化数组

Python串口通信

c++ - 使用带有 PIR 传感器的毫秒检测连续运动

c - 如何计算程序的内存大小?

c++ - 添加堆栈中的每个值

c++ - 没有配置文件来制作qt的静态版本

c++ - 如何在 C++17 中将 std::string 转换为 std::vector<std::byte>?

c++ - 链接到 C++ 库时在 C 中使用 setjmp 和 longjmp

c++ - 在等待 std::condition_variable 时如何处理系统时钟的变化?

c++ - C++ 中的 new 与 *new