提问人:Louis Caron 提问时间:9/13/2022 最后编辑:phuclvLouis Caron 更新时间:7/10/2023 访问量:172
当变量超出范围时,有没有办法强制 gcc 从堆栈中释放空间
Is there a way for force gcc to free the space from the stack when variables go out of scope
问:
我有以下一段代码:
extern void func1(char *array);
extern void func2(char *array);
void myfunction(void) {
if (somecondition) {
char var2[256];
func2(var2);
}
if (someothercondition) {
{
char var3[3];
func3(var3);
}
}
我无法让我的编译器 (gcc) 调用堆栈中仅用于 3 个字节。它始终为调用范围内使用的空间分配空间,即使此变量超出范围并且可以安全地从堆栈中删除。func3
var3
var2
func2
我尝试了在 gcc 文档中找到的几个选项:
fomit-frame-pointer
fconserve-stack
我已经在 x86 和 ARM 架构上尝试过了,它的行为相同。
这个问题背后的基本原理是仅使用必要的堆栈大小。
而相关的问题:如果可以优化堆栈空间,是否可以在选项生成的 .su 文件中添加用于每个子函数调用的堆栈。-fstack-usage
谢谢
答:
1赞
anton-tchekov
7/10/2023
#1
你可以做这样的事情:
extern void func1(char *array);
extern void func2(char *array);
void _helper(/* neccessary parameters */)
{
char var2[256];
func2(var2);
}
void myfunction(void) {
if (somecondition) {
_helper(/* neccessary parameters */);
}
if (someothercondition) {
{
char var3[3];
func3(var3);
}
}
由于分配发生在不同的函数中,因此编译器只会在调用 时分配内存。这可能容易受到优化(内联)的影响,但将帮助程序移动到不同的编译单元(新的 c 文件)将阻止这种情况。_helper
当然,这将是以函数调用和参数复制为代价的。
无论如何,如果堆栈空间问题与递归有关,则应考虑将其替换为使用显式预分配堆栈的迭代解决方案。
评论
0赞
Louis Caron
7/10/2023
这是我想出的解决方案,但由于我的代码是由闭源商业工具自动生成的,因此我无法修改它。我一直在寻找一个编译器选项来允许这种优化。
评论
alloca