是否为 c/c++ 中的块(条件或无条件)代码分配了新的堆栈帧?

jai*_*ogj 1 c++ stack callstack memory-management function

我查看了区分堆栈和堆分配的帖子。据我所知,堆栈帧是为每个函数调用分配的。

但我的问题在于函数内部的块?如何为此类代码管理/分配内存?这样的堆栈帧的本地存储大小是如何创建的?

class A; class B; class C;

func block() {
    if (condition) {
        A var;
    } else {
        B var;
    }

    {
        A var;
        B var;
        C var;
    }

}
Run Code Online (Sandbox Code Playgroud)

Sor*_*tir 5

首先,请注意,这是一个纯粹的实现细节,只要结果的行为就像执行原始代码一样,编译器就可以自由地执行该操作。堆栈帧只是实现该目标的实际硬件使用的细节。

也就是说,大多数现实世界的编译器将简单地计算给定函数可能需要的所有堆栈空间,并在函数入口处分配该空间。它不一定会全部被使用(例如,在给定的函数调用中甚至可能不会输入特定的块),但该块所需的变量的堆栈空间仍将作为函数序言的一部分保留。这是完成的,而不是在函数执行的几个点上改变堆栈空间。