gpt4 book ai didi

c - C 标准是否对使用的堆栈空间量有任何保证?

转载 作者:行者123 更新时间:2023-12-03 14:36:25 24 4
gpt4 key购买 nike

我正在做嵌入式编程,其中节省内存很重要。
以下 C 代码在运行时会占用多少堆栈空间?

if (send_small_message) {
uint8_t buffer[16000];
// do something with the buffer
} else {
uint8_t buffer[32000];
// do something the with buffer
}
某些编译器能否决定为两个缓冲区分配 16000 + 32000 = 48kB 堆栈空间?或者是否保证因为两个缓冲区永远不会同时使用,编译器将只分配 32kB - 较大缓冲区的大小?
跟进问题:
void SendSmallMessage() {
uint8_t buffer[16000];
// do something with the buffer
}

void SendLargeMessage() {
uint8_t buffer[32000];
// do something with the buffer
}
某些编译器编译的代码是否可以在运行时使用 16000 + 32000 字节来执行以下代码段:
if (send_small_message) {
SendSmallMessage();
} else {
SendLargeMessage();
}

最佳答案

Does the C standard guarantee amount of stack used?


对此不存在任何保证。 C 标准没有提到像栈这样的概念。您甚至可以为完全没有堆栈的低级 CPU 编写 C。
然而,C 标准确实保证 uint8_t是 1 字节大,并且 1 字节在您的系统上是 8 位(否则 uint8_t 将不可用)。

How much stack space would the following C code occupy at run-time?
Could some compiler decide to allocate 16000 + 32000 = 48kB stack space for both buffers?


特定于系统,但也取决于函数的编写方式和发生的优化。但是,一般来说,在给定所有可能的执行路径的情况下,现实世界的系统为函数所需的堆栈分配空间。所以很可能许多编译器会分配 16k + 32k。
但谁在乎呢,因为在任何已知系统的堆栈上分配大量内存都没有意义。不是在高端的类似 PC 的系统上,当然也不是在内存受限的嵌入式系统上。你会到处都是堆栈溢出。
嵌入式中的一般经验法则是永远不要在堆栈上分配任何形式的缓冲区,而是始终具有静态存储持续时间。在类似 PC 的系统上,堆分配是另一种选择。

关于c - C 标准是否对使用的堆栈空间量有任何保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64047253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com