gpt4 book ai didi

c++ - 函数所需的总堆栈大小与变量范围有何关系?

转载 作者:可可西里 更新时间:2023-11-01 17:58:43 34 4
gpt4 key购买 nike

我在用 Visual Studio 2010 编译的程序中出现堆栈溢出。我有一个宏,在一个 do-while block 中,使用分配在堆栈上的小字符数组 (8 KiB) 执行一些与字符串相关的工作.然后我有一个函数,我在同一个范围内多次使用这个宏。现在我遇到了堆栈溢出问题。

我假设堆栈分配是 do-while block 的本地分配,因此当 block 结束时数组将不复存在,因此不会影响函数的整体堆栈使用,但看来我错了.

使用调试器,我能够看到在进入函数时调用了 _chkstk()。作为此函数的参数,堆栈大小略大于该函数中每次调用宏的所有 8 KiB 数组的总和(由于其他局部变量,略大)。

我用一个简单的例子重现了这个问题:

void func(void)
{
{char a[500000];}
{char b[500000];}
{char c[500000];}
{char d[500000];}
{char e[500000];}
}

在一个简单的控制台应用程序中,从 main() 调用此函数将导致堆栈溢出。然而,删除除了一个 block 语句之外的所有语句将运行得很好。

我想知道这是否按预期工作?

如何计算函数所需的总堆栈大小?如何计算函数所需的堆栈大小?即使在超出范围之后,堆栈上的数组仍然会影响函数的总堆栈大小?

为什么会出现堆栈溢出

最佳答案

我很确定标准并没有准确定义这些变量需要多少堆栈空间(或者实际上它们存储在堆栈中)。编译器当然不需要为这些局部变量中的每一个分配空间。实际重用也可能高度依赖于编译器的优化级别 - 因此如果您使用不同的优化级别进行编译(或者如果您启用/禁用某些优化功能),它可能会做不同的事情。

在 C++ 中,对构造函数和析构函数的调用是为包含变量的 block 定义的,因此如果您要使用 std::vector,内存(从堆中分配)会在以下情况下释放 block 结束。

总结:空间可以重复使用,但不能保证。

关于c++ - 函数所需的总堆栈大小与变量范围有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502122/

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