考虑我有以下结构:
struct BigStruct {
char data1[999];
char data2[999];
...
char dataN[999];
}
在代码中的某处我有一个初始化类型的非静态变量:
struct BigStruct foo =
{
.data1 = {0},
.data2 = {0},
...
.dataN = {0},
}
看起来这里将尝试在堆栈上分配几KB的内存。我是对的吗?
没关系,还是一种不好的做法?
答案 0 :(得分:0)
使用自动存储没有任何问题。
如果结构对于您的平台来说太大,您的程序可能会崩溃。
在Linux系统上,您可以使用ulimit -s
或ulimit -a
答案 1 :(得分:0)
这取决于您的软件架构和目标。
如果您正在编写内核代码,那么您不想使用大量的堆栈空间; Linux kernel stacks are small
用户程序通常有1 Mb或更大的堆栈,所以除非你有很多递归例程,否则在堆栈上分配几个kB通常不是问题。
在Linux中,您可以使用ulimit -s
检查堆栈大小。结果是在KiB。
答案 2 :(得分:0)
回到内存堆栈的时代(并且是)在调用函数之前保存寄存器内容(和传递参数)的方法(实际上,即使在今天,许多微控制器都是这样工作的)。滥用这样的概念是不可移植的! (你可以找到程序崩溃的一些架构)