如何避免将此变量放在堆栈上
How can I avoid putting this variable on the stack?
我目前正在调整一些示例Arduino代码以满足我的需求。以下片段使我感到困惑:
// Dont put this on the stack:
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
将buf
变量放在堆栈上是什么意思?我该如何避免这样做?如果我这样做可能会发生什么坏事?
程序堆栈的尺寸有限(即使在台式计算机上,它通常在兆字节上封顶,在arduino上,它可能会小得多)。
。所有功能函数的局部变量以Lifo方式存储在那里;您的main
方法的变量位于堆栈的底部,其顶部在main
中调用的函数的变量,依此类推;空间(通常)保留在输入函数时,并且直到函数返回之前才回收。如果功能分配了真正巨大的缓冲区(或呼叫链中的多个功能分配稍小的缓冲区),则可以快速接近堆栈限制,这会导致您的程序崩溃。
听起来您的数组是在函数的外部分配的,将其放在全局范围内。缺点是只有一个共享缓冲区(因此,两个函数不能同时使用它而不协调访问,而堆栈缓冲区将独立保留每个功能),但上升空间是它不花费堆栈来堆栈用它;它是从程序内存的单独部分分配的(通常是无限的部分,或者至少在千兆内有限制,而不是兆字节范围)。
所以回答您的问题:
将
buf
变量放在堆栈上是什么意思?
如果它会在堆栈上:
- 在功能范围而不是全局范围中声明,
- 并未将其声明为
static
(或thread_local
,尽管这比您现在应该关注的要复杂得多);如果在功能范围中声明为static
,则基本上是全局内存,只能在该特定函数中直接引用
如何避免这样做?
不要在功能范围内声明巨大的非static
数组。
如果我这样做会发生什么坏事?
如果阵列足够大,您可能会因用完可用的堆栈空间而遭受堆栈的溢出,使您的程序崩溃。
相关文章:
- 堆栈变量超出范围时是否解除分配?
- 堆栈变量和函数C++奇怪的行为
- 野牛堆栈变量中的值分配
- 局部堆栈变量成员的返回值优化
- 访问其他线程堆栈变量如何在C++中工作?
- 指向堆栈变量的指针是否易失
- 是否可以 std::move 局部堆栈变量?
- 返回堆栈变量时停止调用析构函数
- 优化易失性堆栈变量的存储/构造是否合法
- SEGFAULT正在写入堆栈变量
- 汇编:C++堆栈变量地址不同/错误?
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- 返回堆栈变量
- Visual Studio 在引用堆栈变量时不使用 EBP
- 堆栈变量或函数声明
- 访问堆栈变量的速度比取消引用指针慢
- 静态变量与堆栈变量:线程安全与堆栈大小
- 堆栈变量生存期好奇的例子
- 如何查找未初始化的堆栈变量
- 如何为堆栈变量分配内存