我正在对一些具有 64 MB SDRAM 的嵌入式设备进行编程。 (C 用作编程语言)。 是否可以猜测(甚至是粗略的猜测)这个设备的堆栈的可能大小? 指的是我们进行分配时使用的内存,例如,
char s[100];
int t[50];
等等
例如,它会超过 50KB 吗?等等,这就是我所说的粗糙
加上当我在某个函数 f 中有变量时
f()
{
int p;
}
当 f() 存在时,这个变量就死了吗?
所以当我调用 f2() 时:
void f2()
{
char t[100];
}
只有 100 个元素的 char 数组的大小会被添加到堆栈大小,对吗?
不再考虑来自先前函数的 int p
的大小。
最佳答案
可以做出各种猜测 :) 大多数(所有?)嵌入式开发环境都提供分配设备内存的机制(只读、堆栈、堆等)。这通常通过链接器指令文件或 C#pragmas 完成放置在安装源文件中。如果没有关于您的开发环境的更多信息,则无法做出准确的猜测。
在函数f()
中,变量p
会存在于栈中。当函数退出时,堆栈上的该位置可能会用于其他用途。
对于函数 f2()
,您可以预期在执行此函数时,堆栈中的 100 个字节将分配给 t
。 p
的大小将不被考虑。
请注意,堆栈可用于其他信息,因此您无法在不考虑其他因素的情况下可靠地估计堆栈使用情况。例如,你期望递归吗?堆栈可用于存储函数调用/返回信息 - 从而减少本地(堆栈)变量的空间量。
最后,我曾使用过小于 1KB 堆栈的设备,因此应谨慎做出假设。
关于c - 嵌入式设备可能的堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21336788/