gpt4 book ai didi

c++ - C++ 中的局部变量通常在什么时候分配内存?

转载 作者:IT老高 更新时间:2023-10-28 12:53:29 28 4
gpt4 key购买 nike

我正在调试一个相当奇怪的堆栈溢出,据说是由于在堆栈上分配了太大的变量而引起的,我想澄清以下内容。

假设我有以下功能:

void function()
{
char buffer[1 * 1024];
if( condition ) {
char buffer[1 * 1024];
doSomething( buffer, sizeof( buffer ) );
} else {
char buffer[512 * 1024];
doSomething( buffer, sizeof( buffer ) );
}
}

我知道,它依赖于编译器,也取决于优化器的决定,但是为这些局部变量分配内存的典型策略是什么?

最坏的情况(1 + 512 KB)是在进入函数后立即分配还是先分配 1 KB,然后根据情况再分配 1 或 512 KB?

最佳答案

在许多平台/ABI 上,整个堆栈帧(包括每个局部变量的内存)都是在您输入函数时分配的。在其他情况下,根据需要逐位推送/弹出内存是很常见的。

当然,在一次性分配整个堆栈帧的情况下,不同的编译器可能仍会决定不同的堆栈帧大小。在您的情况下,一些编译器会错过优化机会,并为 每个 局部变量分配唯一的内存,即使是在代码的不同分支中的那些(1 * 1024 数组和 512 * 1024 在你的情况下),其中更好的优化编译器应该只分配通过函数的任何路径所需的最大内存( else 路径在你的情况下,分配一个 512kb 的 block 就足够了)。 如果您想知道您的平台是做什么的,请查看反汇编。

但是看到立即分配的整个内存块我不会感到惊讶。

关于c++ - C++ 中的局部变量通常在什么时候分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7089035/

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